Was ist ein "Subreaper" -Prozess?


38

Das Wort "Subreaper" wird in einigen Antworten verwendet. Bei der Google-Suche werden auch Einträge angezeigt, bei denen das Wort "nur verwendet" wird.

Wie kann ich verstehen, was ein "Subreaper" ist?


3
Ich habe das Wort noch nie gehört. Können Sie einige Referenzen für den Kontext angeben?
Celada

5
Hier ist eine: Ich habe sie in einer Antwort unter unix.stackexchange.com/a/177361/5132 verwendet .
JdeBP

Zugehörige Frage, die ich vielleicht hier hätte posten
artfulrobot

Antworten:


49

Dies wurde im Linux-Kernel 3.4 als Flag des Systemaufrufs prctl () implementiert .

Aus der prctl(2)Manpage:

[...] Ein Subreaper erfüllt die Rolle init(1)für seine Nachfolgeprozesse . Nach Beendigung eines Prozesses, der verwaist ist (dh dessen unmittelbares Elternteil bereits beendet wurde) und als Subreaper gekennzeichnet ist, erhält der nächste noch lebende Ahnen-Subreaper ein SIGCHLDSignal und kann wait(2)im Prozess seinen Beendigungsstatus ermitteln.

Ein Prozess kann sich als Subreaper mit definieren prctl(PR_SET_CHILD_SUBREAPER). Wenn ja, wird nicht init(PID 1) zum Elternteil verwaister Kindprozesse , sondern der nächste lebende Großelternteil, der als Subreaper markiert ist, wird zum neuen Elternteil. Wenn es keine lebenden Großeltern gibt, inittut.

Der Grund , diesen Mechanismus zu implementieren war , dass User - Space - Service - Manager / Supervisor (wie upstart, systemd) müssen ihre Dienste gestartet verfolgen. Viele Dienste dämonisieren durch Double-Forking und werden implizit zu PID 1 umerzogen . Der Service-Manager kann die SIGCHLDSignale für sie nicht mehr empfangen und ist nicht mehr dafür verantwortlich, die Kinder mit zu ernten wait(). Alle Informationen zu den untergeordneten Elementen gehen in dem Moment verloren, in dem PID 1 die übergeordneten Prozesse bereinigt. Ein Service Manager-Prozess kann sich jetzt als eine Art "Sub-Init" markieren und kann nun als übergeordneter Prozess für alle verwaisten Prozesse verwendet werden, die von den gestarteten Diensten erstellt wurden. Alle SIGCHLDSignale werden an den Servicemanager gesendet.

Unter Linux wird ein Daemon normalerweise durch zweimaliges Verzweigen erstellt, wobei der Zwischenprozess nach dem Verzweigen des Enkelkinds beendet wird. Dies ist eine übliche Technik, um Zombieprozesse zu vermeiden . Das Init-Skript ruft ein Kind auf. Das Kind gabelt sich wieder und geht sofort wieder. Das Enkelkind wird von adoptiert init, das ständig wait()den Ausreisestatus seiner Kinder abfragt, um Zombies auszuweichen. Mit dem Konzept der Subreaper wird der Userspace-Service-Manager jetzt zum neuen übergeordneten Element init.


Kann ich also denken, dass der Prozess den "Unter" -Prozess "erntet"? Oder ist der Prozess ein "Unter" -Reaper, weil der "Haupt" -Reaper init ist? Ich versuche nur zu überlegen, wie der Begriff geprägt wurde. Danke für die Antwort!
Kenchew

3
Unter dem obigen Link zum Linux-Kernel 3.4 enthält der Commit-Kommentar für diese Implementierung weitere Details. (Beeindruckt von den Details, die in einem Git-Kommentar versteckt sind)
kenchew
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.