Três respostas escritas em 2014, todas dizendo que no Unices e no Linux o processo é reparado para processar # 1 sem exceção. Três respostas erradas. ☺
Como o SUS diz, citado em uma das outras respostas aqui, então não vou citar novamente, O processo pai de filhos órfãos é configurado para um processo definido pela implementação . Cristian Ciupitu está certo em consultar a documentação do Linux para ver o que a implementação define. Mas ele está sendo enganado por essa documentação, que é inconsistente e não está atualizada.
Dois anos antes de essas três respostas serem escritas, e chegando rápido até três anos atrás, no momento em que escrevi a primeira resposta, o kernel do Linux mudou. Os desenvolvedores do systemd adicionaram a capacidade de os processos se configurarem como "sub-níveis". A partir do Linux 3.4, os processos podem emitir a chamada de sistema prctl()
com a opção PR_SET_CHILD_SUBREAPER
e, como resultado, eles, e não o processo # 1, se tornarão pais de qualquer um de seus processos descendente órfãos. A página man de prctl()
está atualizada, mas outras man pages não foram atualizadas e feitas consistentes.
Na versão 10.2, o FreeBSD ganhou a mesma capacidade, estendendo sua chamada de sistema procctl()
com as opções PROC_REAP_ACQUIRE
e PROC_REAP_RELEASE
. Adotou este mecanismo do FreeBSD DragonFly; que ganhou na versão 4.2, originalmente chamada reapctl()
mas renomeada durante o desenvolvimento para procctl()
.
Portanto, há exceções e outras bastante proeminentes: No Linux, no FreeBSD / PC-BSD e no FreeBSD DragonFly, o processo pai de filhos órfãos é definido como o processo ancestral mais próximo do filho que está marcado como um subpertentor, ou processe # 1 se não houver nenhum processo de sub-traçador de ancestral. Vários utilitários de supervisão de daemon - incluindo o systemd (aquele cujos desenvolvedores colocaram isso no kernel Linux em primeiro lugar), o upstart eo nosh
service-manager
- já fazem uso disso.
Se esse supervisor de daemon não for o processo # 1 e gerar um serviço como uma sessão de login interativa, e nessa sessão será feito um the (bastante equivocado) truque de tentar "daemonizar" em dobro- fork()
, então o processo vai acabar como filho do supervisor daemon, não do processo # 1. Esperar ser capaz de gerar daemons diretamente nas sessões de login é um erro fundamental, é claro. Mas essa é outra resposta.
Leitura adicional