Isso foi implementado no kernel Linux 3.4 como sinalizador da chamada do sistema prctl () .
Na% man_de% manpage:
[...] A subreaper fulfills the role of
init(1)
for its descendant processes. Upon termination of a process that is orphaned (i.e., its immediate parent has already terminated) and marked as having a subreaper, the nearest still living ancestor subreaper will receive aSIGCHLD
signal and be able towait(2)
on the process to discover its termination status.
Um processo pode se definir como um subinterruptor com prctl(2)
. Em caso afirmativo, não é prctl(PR_SET_CHILD_SUBREAPER)
(PID 1) que se tornará pai de processos filho órfãos. Avô que está marcado como um subpertório se tornará o novo pai. Se não houver nenhum avô vivo, init
faz.
O motivo para implementar esse mecanismo foi que os gerentes / supervisores de serviço do espaço do usuário (como init
, upstart
precisa monitorar seus serviços iniciados. Muitos serviços daemonizam com double-forking e implicitamente re-parentam para PID 1. O gerente de serviços não poderá mais receber os sinais systemd
para eles e não é mais responsável por colher os filhos com SIGCHLD
. Todas as informações sobre as crianças são perdidas no momento em que o PID 1 limpa os processos controlados. Agora, um processo de gerenciador de serviços pode se marcar como uma espécie de "sub-init" e agora pode permanecer como pai de todos os processos órfãos criados pelos serviços iniciados. Todos os sinais wait()
serão entregues ao gerente de serviços.
No Linux, um daemon é normalmente criado por bifurcação duas vezes com o processo intermediário saindo depois de bifurcar o neto. Essa é uma técnica comum para evitar processos zumbis . O script de inicialização chama uma criança. Aquela criança se bifurca novamente e, assim, sai imediatamente. O neto será adotado por SIGCHLD
, que chama continuamente init
para coletar o status de saída de seus filhos para evitar zumbis. Com o conceito de subagrupadores, o gerenciador de serviços do espaço do usuário agora se torna o novo pai, em vez de wait()
.