Hintergrund
Ich wurde gebeten, ein systemdSkript 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.servicesystemctl stop foo_daemon.servicesystemctl restart foo_daemon.service
Problem
Manchmal müssen foo_daemonwir es aufgrund eines schlechten Zustands zwangsweise töten , indem wir:
systemctl kill -s KILL foo_daemon.service
Frage
Wie kann ich mein systemdSkript foo_daemonso einrichten, dass bei jedem Versuch eines Benutzers, den Dienst zu stoppen / neu zu starten, Folgendes ausgeführt systemdwird:
- Versuchen Sie ein ordnungsgemäßes Herunterfahren von
foo_daemonviaSIGTERM. - Warten Sie bis zu 2 Sekunden, bis das Herunterfahren / Beenden
foo_daemonabgeschlossen ist. - Versuchen Sie ein erzwungenes Herunterfahren von
foo_daemonvia,SIGKILLwenn der Prozess noch aktiv ist (sodass wir nicht das Risiko haben, dass die PID recycelt wird undsystemdProblemeSIGKILLmit 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
SIGKILLangeht , kann ich das Skript nur gegen die PID des Prozesses ausgeben , ohne mir Gedanken über das Töten einer recycelten PID zu machen.