Detener a través del servicio systemd

Detener a través del servicio systemd

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 haltmismo) que no muere cortésmente cuando se solicita. Es decir, es una especie de serpiente que persigue su propia cola.

El servicio no tiene ExecStopy es Type=forking.

Respuesta1

En man systemd.killallí está la siguiente explicación de la KillModeopció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 ExecStoppor 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, ExecStoppodrí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 SIGTERMcontrolador y no espera a los niños, por lo que no necesita una limpieza especial. Por lo tanto, agregar KillMode=processal [Service]bloque resolvió el problema; el demonio se detiene, se deja que haltse complete y el sistema se apaga como lo hace normalmente en unos segundos.

información relacionada