Configure o serviço systemd com bugs para terminar via SIGKILL

16

Antecedentes

Fui solicitado a criar um script systemd para um novo serviço, foo_daemon , que às vezes entra em um "estado ruim" e não morre via SIGTERM (provavelmente devido ao manipulador de sinal personalizado) ). Isso é problemático para desenvolvedores, pois eles são instruídos a iniciar / parar / reiniciar o serviço por meio de:

  • systemctl start foo_daemon.service
  • systemctl stop foo_daemon.service
  • systemctl restart foo_daemon.service

Problema

Às vezes, devido a foo_daemon entrar em um estado ruim, precisamos forçá-lo a matar:

  • systemctl kill -s KILL foo_daemon.service

Pergunta

Como posso configurar meu script systemd para foo_daemon para que, sempre que um usuário tentar interromper / reiniciar o serviço, systemd :

  • Tente um desligamento normal de foo_daemon via SIGTERM .
  • Dê até 2 segundos para o encerramento / encerramento de foo_daemon para concluir.
  • Tente um desligamento forçado de foo_daemon via SIGKILL se o processo ainda estiver ativo (portanto, não corremos o risco de o PID ser reciclado e systemd emite SIGKILL contra o PID incorreto). O dispositivo que estamos testando gera / bifurca vários processos rapidamente, então, há uma preocupação rara, mas muito real, com a reciclagem de PIDs que causa um problema.
  • Se, na prática, estou apenas paranóico com a reciclagem do PID, estou bem com o script emitindo apenas SIGKILL contra o processo 'PID sem se preocupar em matar um PID reciclado.
por DevNull 28.08.2018 / 20:11

1 resposta

23
O

systemd já suporta isso imediatamente, e é ativado por padrão .

A única coisa que você pode querer personalizar é o tempo limite, o que você pode fazer com TimeoutStopSec= . Por exemplo:

[Service]
TimeoutStopSec=2

Agora, o systemd enviará um SIGTERM, esperará dois segundos para o serviço sair e, se não, enviará um SIGKILL.

Se o seu serviço não estiver ciente do systemd, talvez seja necessário fornecer o caminho para o arquivo PID com PIDFile= .

Finalmente, você mencionou que seu daemon gera muitos processos. Nesse caso, talvez você queira definir KillMode=control-group e systemd enviará sinais para todos os processos no cgroup.

    
por 28.08.2018 / 20:20