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?
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?
Antworten:
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 einSIGCHLD
Signal und kannwait(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, init
tut.
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 SIGCHLD
Signale 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 SIGCHLD
Signale 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
.