GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi Systemd arrête-t-il le service immédiatement après son démarrage ?

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.target 

Lorsque 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/null

C'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 que ExecStart 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 start-stop-daemon c'est pourquoi les choses vont mal. Parce que le processus exécutant start-stop-daemon ne devient le service, mais en fait se termine presque immédiatement, systemd pense que votre service se termine. Dans votre premier systemctl status sortie, vous pouvez voir que systemd est en train d'envoyer SIGTERM pour nettoyer tous les processus restants en cours d'exécution après l'exécution de ExecStop action, c'est-à-dire ce qu'il fait lorsqu'il pense qu'un service s'est terminé.

Connexe:Les fenêtres Compiz + MATE sautent à l'espace de travail précédent?

Faites les choses simplement :

Type=simpleWorkingDirectory=/home/ubuntu/console/binUser=ubuntuExecStart=/home/ubuntu/console/bin/consoleExecutable

Pas d'ExecStop ni Environment 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

Linux
  1. Comment créer un service Systemd sous Linux

  2. Ajouter un nouveau service à Linux systemd

  3. Arrêt de Systemd Unit avec un autre. Démarrage des travaux ?

  4. Exécuter le service Systemd après le montage automatique, mais après y avoir accédé ?

  5. Le service MongoDB ne démarre pas après la configuration initiale

Commandes Systemctl pour gérer le service Systemd

10 commandes systemd pratiques :une référence

Gestion des cgroups avec systemd

Premiers pas avec systemctl

Comment arrêter le service systemd

Désactiver un service systemd après un temps d'inactivité