tło
Poproszono mnie o stworzenie systemdskryptu dla nowej usługi, foo_daemonktóra czasami przechodzi w „zły stan” i nie umrze przez SIGTERM(prawdopodobnie z powodu niestandardowej procedury obsługi sygnałów). Jest to problematyczne dla programistów, ponieważ są oni instruowani, aby uruchomić / zatrzymać / zrestartować usługę poprzez:
systemctl start foo_daemon.servicesystemctl stop foo_daemon.servicesystemctl restart foo_daemon.service
Problem
Czasami, z powodu foo_daemonpopadnięcia w zły stan, musimy siłą go zabić poprzez:
systemctl kill -s KILL foo_daemon.service
Pytanie
Jak skonfigurować systemdskrypt, foo_daemonaby za każdym razem, gdy użytkownik spróbuje zatrzymać / ponownie uruchomić usługę, systemdbędzie:
- Spróbuj z wdziękiem wyłączyć
foo_daemonviaSIGTERM. - Daj do 2 sekund na zakończenie / zakończenie działania
foo_daemon. - Próbować wymuszone wyłączenie
foo_daemonpoprzezSIGKILLjeśli proces jest wciąż żywy (więc nie ma ryzyka PID zawraca isystemdproblemySIGKILLprzed niewłaściwym PID). Testowane przez nas urządzenie odradza się / rozwidla szybko wiele procesów, więc istnieje rzadka, ale bardzo realna obawa o to, że recykling PID powoduje problem. - Jeśli w praktyce jestem po prostu paranoikiem odnośnie recyklingu PID, nie mam nic
SIGKILLprzeciwko skryptowi, który wystawia się przeciwko procesowi PID, nie martwiąc się o zabicie przetworzonego PID.