Parada via serviço systemd

1

Versão resumida: Como posso obter um serviço controlado pelo sistema para acionar um desligamento imediato?

Eu tenho um daemon com poderes para fazer coisas arbitrárias em resposta a certos eventos através de um script shell (fork / exec'd) que termina com

exec halt -p

Ou mais especificamente, exec $@ , mas, neste caso, $@ é halt -p . Eu também tentei:

  • shutdown now
  • systemctl halt .

Enquanto isso funciona, parece haver um problema que faz com que o desligamento, que normalmente leva apenas alguns segundos, leve vários minutos. Eu suspeito que é porque o systemd está esperando em um processo filho de um serviço (o próprio halt ) que não morre educadamente quando solicitado. Ou seja, é uma espécie de cobra que persegue o próprio cenário da cauda.

O serviço não tem ExecStop e é Type=forking .

    
por goldilocks 02.10.2016 / 16:12

1 resposta

0

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.

    
por 03.10.2016 / 15:21