A palavra "subreaper" é usada em algumas respostas. Pesquisando no Google, também são exibidas entradas onde a palavra é "apenas usada".
Como posso entender o que é um "subreaperador"?
A palavra "subreaper" é usada em algumas respostas. Pesquisando no Google, também são exibidas entradas onde a palavra é "apenas usada".
Como posso entender o que é um "subreaperador"?
Respostas:
Isso foi implementado no kernel do Linux 3.4 como um sinalizador da chamada de sistema prctl () .
Na página de prctl(2)
manual:
[...] Um subreperador cumpre o papel de
init(1)
para seus processos descendentes. Após o término de um processo que é órfão (ou seja, seu pai imediato já terminou) e marcado como tendo um sub-leitor, o sub-leitor ancestral ainda mais vivo receberá umSIGCHLD
sinal e poderá,wait(2)
no processo, descobrir seu status de encerramento.
Um processo pode se definir como um sub-leitor de prctl(PR_SET_CHILD_SUBREAPER)
. init
Nesse caso, não é (PID 1) que se tornará o pai de processos filhos órfãos ; em vez disso, o avô vivo mais próximo, marcado como um subárea, se tornará o novo pai. Se não há avô vivo, init
faz.
A razão para implementar esse mecanismo era que os gerentes de serviços userspace / supervisores (como upstart
, systemd
) necessidade de rastrear os seus serviços iniciados. Muitos serviços daemonizam com bifurcação dupla e são implicitamente redirecionados para o PID 1. O gerente de serviço não poderá mais receber os SIGCHLD
sinais para eles e não será mais responsável por colher os filhos wait()
. Todas as informações sobre os filhos são perdidas no momento em que o PID 1 limpa os processos re-parentais. Agora, um processo do 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 SIGCHLD
sinais serão entregues ao gerente de serviço.
No Linux, um daemon é normalmente criado bifurcando duas vezes com o processo intermediário saindo após bifurcar o neto. Essa é uma técnica comum para evitar processos zumbis . O script init chama um filho. Essa criança bifurca-se novamente e, portanto, sai imediatamente. O neto será adotado por init
, que continuamente pede wait()
para coletar o status de saída de seus filhos para evitar zumbis. Com o conceito de sub-leitores, o gerenciador de serviços do espaço de usuário agora se torna o novo pai, em vez de init
.