GNU/Linux >> Linux Esercitazione >  >> Linux

Perché Systemd interrompe il servizio immediatamente dopo l'avvio?

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.

Correlati:le finestre di Compiz + MATE passano allo spazio di lavoro precedente?

Basta fare le cose semplicemente:

Type=simple
WorkingDirectory=/home/ubuntu/console/bin
User=ubuntu
ExecStart=/home/ubuntu/console/bin/consoleExecutable

Nessun ExecStopEnvironment è 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

Linux
  1. Come creare un servizio Systemd in Linux

  2. Causa Uno script da eseguire dopo l'avvio della rete?

  3. Centos - Systemd uccide il servizio immediatamente dopo l'avvio?

  4. Eseguire il servizio Systemd dopo l'automount ma dopo l'accesso?

  5. Perché la maggior parte degli esempi di Systemd contiene Wantedby=multi-user.target?

Comandi Systemctl per gestire il servizio Systemd

10 pratici comandi di sistema:un riferimento

Gestire cgroup con systemd

Iniziare con systemctl

Come interrompere il servizio systemd

Disattivare un servizio systemd dopo il periodo di inattività