Em man systemd.kill
, há a seguinte explicação da opção KillMode
:
KillMode=
Specifies how processes of this unit shall be killed. One of control-group, process, mixed, none.
If set to control-group, all remaining processes in the control group of this unit will be killed on unit stop (for services: after the stop command is executed, as configured with
ExecStop=
).
Isso implica que um ExecStop
personalizado por si só não ajudará, mas:
If set to process, only the main process itself is killed.
If set to none, no process is killed. In this case, only the stop command will be executed on unit stop,
Portanto, ExecStop
pode ser usado em conjunto com KillMode=none
. Isso seria necessário se o daemon iniciasse processos persistentes, para direcioná-los, mas não o halt
. No meu caso, não, e o daemon em si tem um manipulador SIGTERM
e não espera em filhos, então não precisa de limpeza especial. Portanto, adicionar KillMode=process
ao bloco [Service]
resolveu o problema; o daemon é interrompido, deixando o halt
completo e o sistema desliga normalmente em alguns segundos.