V některých odpovědích se používá slovo „subreaper“. Vyhledávání Google také zobrazí záznamy, kde je slovo „právě použité“.
Jak mohu pochopit, co je „subreaper“?
Přijatá odpověď:
Toto bylo implementováno do linuxového jádra 3.4 jako příznak systémového volání prctl().
Z prctl(2)
manuálová stránka:
[…] Subreaper plní roli
init(1)
pro jeho potomka
procesy. Po ukončení procesu, který je osiřelý (tj. jeho
bezprostřední rodič již skončil) a označený jako
subreaper, obdrží nejbližší stále žijící předek subreaperSIGCHLD
signál a být schopenwait(2)
na procesu zjistit
stav ukončení.
Proces se může definovat jako subreaper pomocí prctl(PR_SET_CHILD_SUBREAPER)
. Pokud ano, není to init
(PID 1), který se stane rodičem osiřelých podřízených procesů, místo toho se novým rodičem stane nejbližší žijící prarodič, který je označen jako subreaper. Pokud neexistuje žádný žijící prarodič, init
ano.
Důvodem implementace tohoto mechanismu bylo to, že manažeři/supervizoři služeb uživatelského prostoru (jako upstart
, systemd
) potřebují sledovat své spuštěné služby. Mnoho služeb je démonizováno dvojitým rozvětvením a implicitně se přerodí na PID 1. Správce služeb již nebude moci přijímat SIGCHLD
signály pro ně a už nemá na starosti sklízení dětí pomocí wait()
. Veškeré informace o dětech jsou ztraceny v okamžiku, kdy PID 1 uklízí přerodičovské procesy. Nyní se proces správce služeb může označit jako jakýsi druh „sub-init“ a nyní může zůstat jako rodič pro všechny osiřelé procesy vytvořené spuštěnými službami. Vše SIGCHLD
signály budou doručeny manažerovi služby.
V Linuxu se démon obvykle vytváří dvojitým forkováním, přičemž prostřední proces se ukončí po rozvětvení vnuka. Toto je běžná technika, jak se vyhnout zombie procesům. Skript init volá dítě. To dítě se znovu rozvětvuje, a tak okamžitě odejde. Vnuk bude adoptován init
, který nepřetržitě volá wait()
sbírat výstupní stav svých dětí, aby se vyhnuli zombie. S konceptem subreaperů se nyní správce služby uživatelského prostoru stává novým rodičem namísto init
.