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"?
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"?
Risposte:
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à unSIGCHLD
segnale e sarà in gradowait(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 init
fa.
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 SIGCHLD
segnali 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 SIGCHLD
segnali 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
.