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