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