O que é um processo de "subreaperador"?

39

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"?

kenchew
fonte
3
Eu nunca ouvi a palavra antes. Você pode incluir algumas referências para o contexto?
Celada
5
Aqui está um: usei-o em uma resposta em unix.stackexchange.com/a/177361/5132 .
JdeBP
Questão relacionada que talvez eu deveria ter postado aqui em vez de no serverfault serverfault.com/questions/747070/...
artfulrobot

Respostas:

50

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á um SIGCHLDsinal 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). initNesse 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, initfaz.

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 SIGCHLDsinais 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 SIGCHLDsinais 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.

caos
fonte
Então, posso pensar que o processo "colhe" o processo "sub"? Ou, o processo é um ceifador "sub" porque o ceifador "principal" é init? Apenas tentando pensar como o termo foi cunhado. Obrigado pela resposta!
kenchew
3
Seguindo o link do kernel Linux 3.4 acima, o comentário de confirmação para esta implementação tem mais detalhes. (Impressionado com os detalhes escondidos em um comentário git)
kenchew