GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué Systemd detiene el servicio inmediatamente después de iniciarlo?

Tengo una aplicación basada en C++ que estoy ejecutando (ejecutable) como un demonio con systemd.

Archivo de unidad:

[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

Cuando emito el comando de inicio, el servicio se está iniciando, pero luego recibe inmediatamente una señal de apagado y luego sale.
¿Alguna pista, qué está sucediendo?

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.

Respuesta aceptada:

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

Esto es casi digno del systemd House of Horror. Si no fuera porque ya hay una historia de terror que hace esto.

No use start-stop-daemon en una unidad de servicio para hacer todas las cosas que ya hace una unidad de servicio . Con archivos PID innecesarios y la suposición equivocada de que ExecStart acepta comentarios de sintaxis de shell, nada menos.

Y no hagas lo que dice la otra respuesta e intenta engañarla con Type=forking . Eso empeora las cosas, no las mejora.

Las tonterías con start-stop-daemon es por eso que las cosas van mal. Porque el proceso que ejecuta start-stop-daemon no se convierte el servicio, pero de hecho sale casi inmediatamente, systemd está pensando que su servicio está terminando. En tu primer systemctl status salida, puede ver que systemd está en medio del envío de SIGTERM para limpiar todos los procesos en ejecución sobrantes después de ejecutar ExecStop acción, que es lo que hace cuando cree que un servicio ha terminado.

Relacionado:¿Las ventanas Compiz + MATE saltan al espacio de trabajo anterior?

Haz las cosas de forma sencilla:

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

Sin ExecStop ni Environment es realmente necesario.

Lecturas adicionales

  • Jonathan de Boyne Pollard (2015). Realmente no necesitas demonizar. De verdad. . El sistema House of Horror.
  • Jonathan de Boyne Pollard (2016). Si tiene dos servicios, defina dos servicios. . El sistema House of Horror.
  • Jonathan de Boyne Pollard (2015). Problemas de protocolo de preparación con demonios Unix . Respuestas frecuentes.
  • Systemd elimina el servicio inmediatamente después del inicio

Linux
  1. Cómo crear un servicio Systemd en Linux

  2. Agregar un nuevo servicio a Linux systemd

  3. ¿Por qué se ejecuta una secuencia de comandos después de que se haya iniciado la red?

  4. Centos:¿Systemd elimina el servicio inmediatamente después del inicio?

  5. ¿Ejecutar el servicio Systemd después de Automount pero después de acceder?

Comandos Systemctl para administrar el servicio Systemd

10 comandos prácticos de systemd:una referencia

Administrar cgroups con systemd

Primeros pasos con systemctl

systemctl detiene el servicio Tomcat inmediatamente después del inicio

El sistema rechaza SSH y se atasca en 'arrancar' después de la instalación de systemd