GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie geht systemd mit dem Tod eines untergeordneten Elements eines verwalteten Prozesses um?

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.


Linux
  1. Wie funktioniert das Sticky Bit?

  2. Was bedeutet in der Ausgabe von Ps?

  3. Wie finde ich alle untergeordneten Prozesse?

  4. Wie funktioniert copy_from_user aus dem Linux-Kernel intern?

  5. So erhalten Sie einen untergeordneten Prozess aus einem übergeordneten Prozess

So ändern Sie die Priorität eines Prozesses in Linux

So senden Sie Prozesse unter Linux an den Hintergrund

Wie bekomme ich die Prozess-ID, um einen Nohup-Prozess zu beenden?

Wie mountet ein Kernel die Root-Partition?

Woher weiß die CPU, welche physikalische Adresse welcher virtuellen Adresse zugeordnet ist?

Wie behält Linux die Kontrolle über die CPU auf einem Single-Core-Rechner?