Che cos'è un processo "subreaper"?


39

La parola "subreaper" è usata in alcune risposte. La ricerca su Google mostra anche voci in cui la parola è "appena usata".

Come posso capire cos'è un "subreaper"?


3
Non ho mai sentito la parola prima. Puoi includere alcuni riferimenti per il contesto?
Celada,

5
Eccone uno: l'ho usato in una risposta su unix.stackexchange.com/a/177361/5132 .
JdeBP,

Domanda correlata che forse avrei dovuto pubblicare qui invece che su serverfault serverfault.com/questions/747070/…
artfulrobot

Risposte:


50

Questo è stato implementato nel kernel Linux 3.4 come flag della chiamata di sistema prctl () .

Dalla prctl(2)manpage:

[...] Un subreaper svolge il ruolo di init(1)per i suoi processi discendenti. Al termine di un processo che è rimasto orfano (ovvero, il suo genitore immediato è già terminato) e contrassegnato come avente un subreaper, il subreaper antenato ancora più vicino vivente riceverà un SIGCHLDsegnale e sarà in grado wait(2)sul processo di scoprire il suo stato di terminazione.

Un processo può definirsi un subreaper con prctl(PR_SET_CHILD_SUBREAPER). In tal caso, non sarà init(PID 1) che diventerà il genitore dei processi figlio orfani , invece il nonno vivente più vicino contrassegnato come subreaper diventerà il nuovo genitore. Se non c'è nessun nonno vivente, lo initfa.

Il motivo per implementare questo meccanismo era che i manager / supervisori dei servizi per gli utenti (come upstart, systemd) devono tenere traccia dei loro servizi avviati. Molti servizi vengono demonizzati con il doppio fork e vengono ricondizionati in modo implicito al PID 1. Il gestore del servizio non sarà più in grado di ricevere i SIGCHLDsegnali per loro e non è più incaricato di raccogliere i bambini wait(). Tutte le informazioni sui bambini vengono perse nel momento in cui PID 1 pulisce i processi ri-genitori. Ora, un processo di Service Manager può contrassegnarsi come una sorta di "sub-init" ed è ora in grado di rimanere come genitore per tutti i processi orfani creati dai servizi avviati. Tutti i SIGCHLDsegnali verranno consegnati al responsabile del servizio.

In Linux, un demone viene in genere creato biforcando due volte con il processo intermedio che esce dopo aver biforcato il nipote. Questa è una tecnica comune per evitare i processi di zombi . Lo script init chiama un bambino. Quel bambino si biforca di nuovo e quindi esce immediatamente. Il nipote sarà adottato da init, che chiama continuamente wait()per raccogliere lo stato di uscita dei suoi figli per evitare gli zombi. Con il concetto di subreapers, il gestore del servizio userspace ora diventa il nuovo genitore, anziché init.


Quindi, posso pensare che il processo "raccolga" il processo "sub"? Oppure, il processo è un mietitore "secondario" perché il mietitore "principale" è init? Sto solo cercando di pensare a come è stato coniato il termine. Grazie per la risposta!
kenchew,

3
Seguendo il link 3.4 del kernel Linux sopra, il commento di commit per questa implementazione ha ulteriori dettagli. (Stupito dai dettagli nascosti in un commento git)
kenchew il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.