Das tut es nicht.
Der Hauptprozess verarbeitet den Tod seiner untergeordneten Elemente auf normale Weise.
Dies ist die POSIX-Welt. Wenn Prozess A B geforkt hat und Prozess B C, D und E geforkt hat; dann sieht Prozess B den SIGCHLD
und wait()
Status von der Beendigung von C, D und E. Prozess A weiß nicht, was mit C, D und E passiert, und dies ist unabhängig von systemd.
Damit A weiß, dass C, D und E terminieren, müssen zwei Dinge passieren.
- A muss sich selbst als "Subreaper" registrieren. systemd tut dies, ebenso wie verschiedene andere Service-Manager, einschließlich upstart und nosh
service-manager
. - B muss
exit()
. Dienste, die töricht, irrtümlich und vergeblich versuchen, sich selbst zu "dæmonisieren", tun dies.
(Mit kevent()
kann man sich schlau machen auf den BSDs. Aber das ist eine Linux-Frage.)
systemd
hat das Konzept eines Hauptprozesses. In der systemd-Dokumentation wird dies als "Hauptdienstprozess" oder einfach als "Hauptprozess" bezeichnet.
Beispiel 4 in der systemd.service-Dokumentation beschreibt, dass der Hauptprozess berechnet wird, wenn Type=forking
.
Die Dokumentation für Restart=
in der systemd.service-Dokumentation beschreiben die verschiedenen Möglichkeiten, wann ein Dienst in Bezug auf den Hauptprozess gestartet wird.
Hier ist der Schlüsseltext aus dem oben verlinkten "Beispiel 4":
systemd wird davon ausgehen, dass sich der Dienst im Prozess der Initialisierung befindet, während das ursprüngliche Programm noch läuft. Sobald er erfolgreich beendet wird und mindestens ein Prozess verbleibt (andRemainAfterExit=no), gilt der Dienst als gestartet.
Oftmals besteht ein traditioneller Daemon nur aus einem Prozess. Wenn daher nach Beendigung des ursprünglichen Prozesses nur noch ein Prozess übrig bleibt, betrachtet systemd diesen Prozess als den Hauptprozess des Dienstes. In diesem Fall ist die $MAINPID-Variable in ExecReload=,ExecStop=usw. verfügbar.
Falls mehr als ein Prozess übrig bleibt, kann systemd den Hauptprozess nicht bestimmen, also wird nicht davon ausgegangen, dass es einen gibt. In diesem Fall wird $MAINPID zu nichts erweitert. Entscheidet sich der Prozess jedoch dafür, eine traditionelle PID-Datei zu schreiben, kann systemd die Haupt-PID von dort lesen. Bitte setzen Sie PIDFile=entsprechend.