Ho un'applicazione basata su C++ che sto eseguendo (eseguibile) come demone con systemd.
File unità:
[Unit] Description=Console Service After=network.target [Service] Environment="USER=ubuntu" "Path=/home/ubuntu/console/bin" WorkingDirectory=/home/ubuntu/console/bin 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 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 Restart=on-failure RemainAfterExit=no TimeoutStopSec=10 SuccessExitStatus=0 1 TimeoutStartSec=360 [Install] WantedBy=multi-user.target
Quando eseguo il comando di avvio, il servizio si avvia, ma riceve immediatamente un segnale di arresto e quindi si chiude.
Qualche indizio, cosa sta succedendo?
sudo systemctl status console.service ● console.service - Console Service Loaded: loaded (/etc/systemd/system/console.service; enabled; vendor preset: enabled) Active: deactivating (stop-sigterm) since Mon 2017-09-25 19:58:58 UTC; 1s ago Process: 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) Process: 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=exited, status=0/SUCCESS) Main PID: 8701 (code=exited, status=0/SUCCESS) Tasks: 1 Memory: 1.8M CPU: 53ms CGroup: /system.slice/console.service └─8705 consoleExecutable Sep 25 19:58:58 mgmt1 systemd[1]: Started Console Service. sudo systemctl status console.service ● console.service - Console Service Loaded: loaded (/etc/systemd/system/console.service; enabled; vendor preset: enabled) Active: inactive (dead) since Mon 2017-09-25 19:59:01 UTC; 947ms ago Process: 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) Process: 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=exited, status=0/SUCCESS) Main PID: 8701 (code=exited, status=0/SUCCESS) Sep 25 19:58:58 mgmt1 systemd[1]: Started Console Service.
Risposta accettata:
Environment="USER=ubuntu" "Path=/home/ubuntu/console/bin" WorkingDirectory=/home/ubuntu/console/bin 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 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
Questo è quasi degno del sistema House of Horror. Se non ci fosse già una storia dell'orrore che fa questo.
Non utilizzare start-stop-daemon
in un'unità di servizio per fare tutte le cose che un'unità di servizio già fa . Con file PID non necessari e l'ipotesi sbagliata che ExecStart
accetta commenti sulla sintassi della shell, nientemeno.
E non fare quello che dice l'altra risposta e prova a farla con Type=forking
. Questo rende le cose peggiori, non migliori.
Le sciocchezze con start-stop-daemon
ecco perché le cose stanno andando male. Perché il processo che esegue start-stop-daemon
non diventa il servizio, ma in realtà esce praticamente immediatamente, systemd sta pensando che il tuo servizio stia terminando. Nel tuo primo systemctl status
output, puoi vedere che systemd sta inviando SIGTERM
per ripulire tutti i processi in esecuzione rimanenti dopo aver eseguito ExecStop
azione, che è ciò che fa quando pensa che un servizio sia terminato.
Basta fare le cose semplicemente:
Type=simple WorkingDirectory=/home/ubuntu/console/bin User=ubuntu ExecStart=/home/ubuntu/console/bin/consoleExecutable
Nessun ExecStop
né Environment
è effettivamente richiesto.
Ulteriori letture
- Jonathan de Boyne Pollard (2015). Non hai davvero bisogno di demonizzare. Davvero. . La casa dell'orrore sistemata.
- Jonathan de Boyne Pollard (2016). Se hai due servizi, definisci due servizi. . La casa dell'orrore sistemata.
- Jonathan de Boyne Pollard (2015). Problemi di prontezza del protocollo con i demoni Unix . Risposte frequenti.
- Systemd interrompe il servizio immediatamente dopo l'avvio