J'ai une application basée sur C++ que j'exécute (exécutable) en tant que démon avec systemd.
Fichier d'unité :
[Unit]Description=Console ServiceAfter=network.target[Service]Environment="USER=ubuntu" "Path=/home/ubuntu/console/bin" WorkingDirectory=/home/ubuntu/console/binExecStart=/bin/ sh -ec "exec /sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec consoleExecutable " #2> /dev/nullExecStop=/bin/sh -ec "exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable" #2>/dev/nullRestart=on-failureRemainAfterExit=noTimeoutStopSec=10SuccessExitStatus=0 1TimeoutStartSec=360[Install]WantedBy=multi-user.targetLorsque j'émets la commande de démarrage, le service démarre, mais il reçoit immédiatement un signal d'arrêt, puis se ferme.
Un indice, que se passe-t-il ?sudo systemctl status console.service● console.service - Service de console chargé :chargé (/etc/systemd/system/console.service ; activé ; préréglage fournisseur :activé) Actif :désactivation (stop-sigterm) depuis lundi 2017- 09-25 19:58:58 UTC ; Il y a 1 s Processus :8706 ExecStop=/bin/sh -ec exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console. pid --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable #2>/dev/null (code=exited, status=0/SUCCESS) Processus :8701 ExecStart=/bin/sh -ec exec / sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec consoleExecutable #2>/dev/null (code=terminé, état=0/SUCCESS) PID principal :8701 (code=exited, status=0/SUCCESS) Tâches : 1 Mémoire :1,8 M CPU :53 ms CGroup :/system.slice/console.service └─8705 consoleExecutableSep 25 19 :58:58 mgmt1 systemd[1] :Started Console Service.sudo systemctl status console.service● console.service - Console Service Loaded :chargé (/etc/systemd/system/console.service ; activé ; préréglage fournisseur :activé) Actif :inactif (mort) depuis le lundi 2017-09-25 19:59:01 UTC ; Il y a 947 ms Processus :8706 ExecStop=/bin/sh -ec exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console. pid --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable #2>/dev/null (code=exited, status=0/SUCCESS) Processus :8701 ExecStart=/bin/sh -ec exec / sbin/start-stop-daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec consoleExecutable #2>/dev/null (code=sorti, statut=0/SUCCESS) PID principal :8701 (code=sorti, status=0/SUCCESS) 25 septembre 19:58:58 mgmt1 systemd[1] :service de console démarré.Réponse acceptée :
Environnement="USER=ubuntu" "Path=/home/ubuntu/console/bin" WorkingDirectory=/home/ubuntu/console/binExecStart=/bin/sh -ec "exec /sbin/start-stop -daemon -S -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --oknodo --exec consoleExecutable " #2>/dev/nullExecStop=/bin/sh -ec "exec /sbin/start-stop-daemon -K --quiet -c ${USER} -d ${Path} --pidfile=/var/run/console.pid --retry=TERM/30/KILL/5 --oknodo --exec consoleExecutable" #2>/dev/nullC'est presque digne du systemd House of Horror. Si ce n'était pas le cas, il y a déjà une histoire d'horreur là-dedans qui fait ça.
Ne pas utiliser
start-stop-daemon
dans une unité de service pour faire toutes les choses qu'une unité de service fait déjà . Avec des fichiers PID inutiles et l'hypothèse erronée queExecStart
accepte les commentaires de syntaxe shell, pas moins.Et ne faites pas ce que dit l'autre réponse et essayez de l'embrouiller avec
Type=forking
. Cela aggrave les choses, pas mieux.Le non-sens avec
Connexe:Les fenêtres Compiz + MATE sautent à l'espace de travail précédent?start-stop-daemon
c'est pourquoi les choses vont mal. Parce que le processus exécutantstart-stop-daemon
ne devient le service, mais en fait se termine presque immédiatement, systemd pense que votre service se termine. Dans votre premiersystemctl status
sortie, vous pouvez voir que systemd est en train d'envoyerSIGTERM
pour nettoyer tous les processus restants en cours d'exécution après l'exécution deExecStop
action, c'est-à-dire ce qu'il fait lorsqu'il pense qu'un service s'est terminé.Faites les choses simplement :
Type=simpleWorkingDirectory=/home/ubuntu/console/binUser=ubuntuExecStart=/home/ubuntu/console/bin/consoleExecutablePas d'
ExecStop
niEnvironment
est réellement nécessaire.Autres lectures
- Jonathan de Boyne Pollard (2015). Vous n'avez vraiment pas besoin de démoniser. Vraiment. . La maison de l'horreur systemd.
- Jonathan de Boyne Pollard (2016). Si vous avez deux services, définissez-en deux. . La maison de l'horreur systemd.
- Jonathan de Boyne Pollard (2015). Problèmes de protocole de préparation avec les dæmons Unix . Réponses fréquemment données.
- Systemd tue le service immédiatement après le démarrage