Hintergrund
Ich wurde gebeten, ein systemd
Skript für einen neuen Dienst zu erstellen foo_daemon
, der manchmal in einen "schlechten Zustand" gerät und nicht über "stirbt" SIGTERM
(wahrscheinlich aufgrund eines benutzerdefinierten Signal-Handlers). Dies ist für Entwickler problematisch, da sie angewiesen werden, den Dienst über Folgendes zu starten / stoppen / neu zu starten:
systemctl start foo_daemon.service
systemctl stop foo_daemon.service
systemctl restart foo_daemon.service
Problem
Manchmal müssen foo_daemon
wir es aufgrund eines schlechten Zustands zwangsweise töten , indem wir:
systemctl kill -s KILL foo_daemon.service
Frage
Wie kann ich mein systemd
Skript foo_daemon
so einrichten, dass bei jedem Versuch eines Benutzers, den Dienst zu stoppen / neu zu starten, Folgendes ausgeführt systemd
wird:
- Versuchen Sie ein ordnungsgemäßes Herunterfahren von
foo_daemon
viaSIGTERM
. - Warten Sie bis zu 2 Sekunden, bis das Herunterfahren / Beenden
foo_daemon
abgeschlossen ist. - Versuchen Sie ein erzwungenes Herunterfahren von
foo_daemon
via,SIGKILL
wenn der Prozess noch aktiv ist (sodass wir nicht das Risiko haben, dass die PID recycelt wird undsystemd
ProblemeSIGKILL
mit der falschen PID auftreten). Das Gerät, auf dem wir Spawns / Forks testen, führt zu zahlreichen schnellen Prozessen. Daher besteht eine seltene, aber sehr reale Besorgnis darüber, dass das PID-Recycling ein Problem verursacht. - Wenn ich in der Praxis nur paranoid bin, was das PID-Recycling
SIGKILL
angeht , kann ich das Skript nur gegen die PID des Prozesses ausgeben , ohne mir Gedanken über das Töten einer recycelten PID zu machen.