J'ai installé redis sur une machine ubuntu 16.04 et si j'exécute /usr/local/bin/redis-server /etc/redis/cluster/7000/redis.conf
il démarre et je peux me connecter sans problème.
Cependant, je veux le démarrer en utilisant systemctl start redis
, j'ai donc créé le fichier suivant à /etc/systemd/system/redis7000.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/cluster/7000/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
[Install]
WantedBy=multi-user.target
et la config redis a supervised systemd
ensemble
qui me semble bien, mais j'obtiens les erreurs suivantes:
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: Started Redis In-Memory Data Store.
Jan 19 14:54:27 ip-172-31-42-18 redis-server[21661]: 21661:C 19 Jan 14:54:27.680 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
Jan 19 14:54:27 ip-172-31-42-18 redis-server[21661]: 21661:C 19 Jan 14:54:27.680 # Redis version=4.0.6, bits=64, commit=00000000, modified=0, pid=21661, just started
Jan 19 14:54:27 ip-172-31-42-18 redis-server[21661]: 21661:C 19 Jan 14:54:27.680 # Configuration loaded
Jan 19 14:54:27 ip-172-31-42-18 redis-server[21661]: 21661:C 19 Jan 14:54:27.680 # systemd supervision requested, but NOTIFY_SOCKET not found
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: redis7000.service: Main process exited, code=exited, status=1/FAILURE
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: redis7000.service: Unit entered failed state.
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: redis7000.service: Failed with result 'exit-code'.
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: redis7000.service: Service hold-off time over, scheduling restart.
Jan 19 14:54:27 ip-172-31-42-18 systemd[1]: Stopped Redis In-Memory Data Store.
Et je ne suis même pas sûr de ce que cela signifie, alors quelqu'un pourrait-il me guider dans la bonne direction?
Pour exécuter redis sous systemd, vous devez définir supervised systemd
.
Voir le fichier de configuration:
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no - no supervision interaction
# supervised upstart - signal upstart by putting Redis into SIGSTOP mode
# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto - detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
# They do not enable continuous liveness pings back to your supervisor.
supervised no
Doit être changé en:
supervised systemd
Vous pouvez également transmettre cela sur la ligne de commande, qui remplace le paramètre dans redis.conf
. Les systèmes basés sur Red Hat le font. Cela permet également d'exécuter la même instance redis manuellement ou à partir de systemd sans modifier le fichier de configuration.
ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
En outre, vous devez également indiquer à systemd que redis fonctionnera dans ce mode en définissant Type=notify
dans le [Service]
section.
Comme je ne peux pas ajouter de commentaire en raison du manque de réputation, veuillez considérer cela comme un commentaire à la réponse de Michael Hampston.
Lors de la modification du fichier de service systemd
, utilisez la commande systemctl edit redis-server
pour créer un remplacement. Dans la fenêtre d'édition résultante, tapez ce qui suit:
[Service]
Type=notify
Enregistrez et quittez puis terminez l'installation apt install -f
.
Si vous modifiez le service dans /lib/systemd/system
, vous perdrez ces modifications lors de la prochaine mise à jour.
Voir: modifier le fichier d'unité systemd sans altérer le fichier d'unité en amont
PS: Cette question m'a évité d'avoir à me gratter la tête trop longtemps car je viens de rencontrer le problème.
Une des façons de déboguer ceci est de copier la ligne ExecStart
et de l'exécuter sur le terminal, vous obtiendrez fréquemment l'erreur. Cela vous donnera donc plus d'indices à déboguer et à résoudre.
J'ai fait la même chose et j'ai obtenu une erreur exacte et je l'ai résolue.