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