Tengo un servicio systemd (para heka) que me causa algunos dolores de cabeza.
El problema es que "inicio" regresa exitosamente incluso si el demonio heka muere poco después de comenzar. Esto sucede si los archivos de configuración son incorrectos, por ejemplo: el proceso comenzará, verificará la configuración y morirá si no está satisfecho con lo que encuentra. Systemd regresa exitosamente en este caso.
¿Hay alguna forma de obligar a systemd a verificar el estado del programa después de su inicialización? ¿Quizás dormir n segundos después de que haya comenzado el proceso?
Este es el guión:
[Unit]
Description=Heka event/metric/log collection and routing daemon
After=network.target auditd.service
ConditionPathExists=!/etc/heka/hekad_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/heka
Type=simple
PIDFile=/var/run/hekad.pid
ExecStart=/usr/bin/hekad -config=/etc/heka
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
StandardError=inherit
[Install]
WantedBy=multi-user.target
Alias=heka.service
Respuesta1
Puede encadenar varios comandos ExecPostStart juntos. Y puede ejecutarlos incluso si el ExecStart principal falló agregando un-/(systemd.servicio: Tipo =). Algo como esto:
ExecStart=-/usr/bin/hekad -config=/etc/heka
ExecStartPost=/bin/sleep 3
ExecStartPost=/bin/kill -0 $MAINPID &>/dev/null
Esto garantiza que aún podrá MAINPID
utilizarlo al detener o reiniciar el servicio, por ejemplo.
Respuesta2
Si hay una manera fácil de verificar si hekad
todavía está vivo, entonces iniciaría el demonio usando ExecStartPre=/usr/bin/hekad -config=/etc/heka
y ExecStart
ejecutaría un pequeño script que tiene un bucle que primero duerme X segundos, luego verifica si el demonio hekad todavía se está ejecutando. Romper el bucle sólo si hekad
parece haberse detenido.
Respuesta3
Debería utilizarlo ExecStartPost
para iniciar un comando o script que se suspenda y luego ejecute una verificación. Si el resultado es distinto de cero, la unidad se considera una falla.
Ver:https://www.freedesktop.org/software/systemd/man/systemd.service.html