La parola "subreaper" è usata in alcune risposte. La ricerca su Google mostra anche voci in cui la parola è "appena usata".
Come faccio a capire cos'è un "submietitore"?
Risposta accettata:
Questo è stato implementato nel kernel Linux 3.4 come flag della chiamata di sistema prctl().
Dal prctl(2)
pagina man:
[…] Un subreaper svolge il ruolo di init(1)
per i suoi processi discendenti
. Al termine di un processo che è orfano (ovvero, il suo
genitore diretto è già terminato) e contrassegnato come avente un
submietitore, il più vicino submietitore antenato ancora in vita riceverà un SIGCHLD
segnale ed essere in grado di wait(2)
sul processo per scoprire il suo
stato di risoluzione.
Un processo può definirsi un subreaper con prctl(PR_SET_CHILD_SUBREAPER)
. Se è così, non è init
(PID 1) che diventerà il genitore dei processi figlio orfano, invece il nonno vivente più vicino contrassegnato come sub-mietitore diventerà il nuovo genitore. Se non c'è un nonno vivente, init
fa.
Il motivo per implementare questo meccanismo era che i gestori/supervisori dei servizi dello spazio utente (come upstart
, systemd
) devono tenere traccia dei servizi avviati. Molti servizi si demonizzano tramite double fork e vengono implicitamente re-parented al PID 1. Il gestore del servizio non sarà più in grado di ricevere il SIGCHLD
segnala per loro e non è più incaricato di raccogliere i bambini con wait()
. Tutte le informazioni sui bambini vengono perse nel momento in cui PID 1 ripulisce i processi di re-genitorialità. Ora, un processo di gestione dei servizi 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
i segnali saranno consegnati al gestore del servizio.
In Linux, un demone viene in genere creato eseguendo il fork due volte con il processo intermedio terminato dopo il fork del nipote. Questa è una tecnica comune per evitare i processi di zombi. Lo script init chiama un figlio. 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 subreaper, il gestore del servizio spazio utente ora diventa il nuovo genitore, invece di init
.