Fondo
Me pidieron que creara un systemd
script para un nuevo servicio, foo_daemon
que a veces entra en un "mal estado" y no morirá SIGTERM
(probablemente debido a un controlador de señal personalizado). Esto es problemático para los desarrolladores, ya que se les indica que inicien / detengan / reinicien el servicio a través de:
systemctl start foo_daemon.service
systemctl stop foo_daemon.service
systemctl restart foo_daemon.service
Problema
A veces, debido a foo_daemon
un mal estado, tenemos que matarlo por la fuerza a través de:
systemctl kill -s KILL foo_daemon.service
Pregunta
¿Cómo puedo configurar mi systemd
script para foo_daemon
que, cada vez que un usuario intente detener / reiniciar el servicio, systemd
pueda:
- Intenta un apagado elegante de
foo_daemon
viaSIGTERM
. - Espere hasta 2 segundos para
foo_daemon
que se complete el apagado / finalización . - Intente un apagado forzado de
foo_daemon
viaSIGKILL
si el proceso todavía está vivo (por lo que no tenemos el riesgo de que el PID sea reciclado y lossystemd
problemasSIGKILL
con el PID incorrecto). El dispositivo que estamos probando genera / bifurca numerosos procesos rápidamente, por lo que existe una preocupación rara pero muy real sobre el reciclaje de PID que causa un problema. - Si, en la práctica, estoy siendo paranoico sobre el reciclaje de PID, estoy de acuerdo con que el script solo emita
SIGKILL
contra el proceso 'PID sin preocuparme por matar un PID reciclado.