Version corta:¿Cómo puedo hacer que un servicio controlado por systemd active un cierre inmediato?
Tengo un demonio autorizado para hacer cosas arbitrarias en respuesta a ciertos eventos a través de un script de shell (bifurcado/ejecutado) que termina en
exec halt -p
O más específicamente, exec $@
pero en este caso $@
es halt -p
. También lo intenté:
shutdown now
systemctl halt
.
Si bien esto funciona, parece haber un problema que hace que el apagado, que normalmente sólo tardaría unos segundos, demore varios minutos. Sospecho que se debe a que systemd está esperando un proceso secundario de un servicio (el halt
mismo) que no muere cortésmente cuando se solicita. Es decir, es una especie de serpiente que persigue su propia cola.
El servicio no tiene ExecStop
y es Type=forking
.
Respuesta1
En man systemd.kill
allí está la siguiente explicación de la KillMode
opción:
KillMode=
Especifica cómo se eliminarán los procesos de esta unidad. Uno degrupo de control, proceso, mixto, ninguno.
Si se establece engrupo de control,todos los procesos restantes en el grupo de control de esta unidad se cancelarán al detener la unidad (para servicios: después de ejecutar el comando de parada, como se configura con
ExecStop=
).
Esto implica que una personalización ExecStop
por sí sola no ayudará, pero:
Si se establece enproceso, solo se elimina el proceso principal.
Si se establece enninguno, no se mata ningún proceso. En este caso, sólo se ejecutará el comando de parada al detener la unidad,
Por lo tanto, ExecStop
podría usarse junto con KillMode=none
. Esto sería necesario si el demonio iniciara procesos persistentes, para apuntar a ellos pero no a halt
. En mi caso no es así, y el demonio en sí tiene un SIGTERM
controlador y no espera a los niños, por lo que no necesita una limpieza especial. Por lo tanto, agregar KillMode=process
al [Service]
bloque resolvió el problema; el demonio se detiene, se deja que halt
se complete y el sistema se apaga como lo hace normalmente en unos segundos.