No Linux existem dois tipos de processos que podem ser facilmente confundidos. Eu mesmo já respondi coisa errada quando perguntado sobre um ou outro, então vai aqui uma explicação rápida:
Órfãos:
O nome foi muito bem escolhido: O processo pai terminou ou morreu e o processo atual (filho) agora é órfão. No entanto todo processo precisa de um pai, por isso o Linux vai automaticamente fazer com que o processo init adote o processo órfão. Essa operação é chamada reparenting.
A criação intencional de processos órfãos é normalmente ligada a daemons – processos que rodam em background e não precisam de interação de usuário ou stdin/stdout/stderr.
Normalmente são processos benéficos e desejados e não há com que se preocupar.
Um exemplo simples de como iniciar um daemon seria criar um script como esse:
E executá-lo assim:
Enquanto o seu terminal estiver rodando o PPID (Parent Process ID) será a sua sessão do shell:
Mas se você encerrar sua sessão:
Por outro lado processos órfãos também podem ser criados se o processo pai morre ou é morto sem fazer a limpeza necessária e simplesmente abandona os processos filhos. Nesse caso eles vão continuar rodando e consumindo recursos do sistema, o que geralmente não é bom. Numa situação normal o processo init não deve ter muitos filhos.
Não existe uma forma simples de identificar processos órfãos, exceto examinar todos os filhos do processo init e verificar se eles são legítimos ou não.
Para matar um processo órfão um simples kill (-15 ou -9) resolve.
Zumbis
Zumbi é quase o oposto de órfão. Quando um processo pai gera um filho ele aguarda a execução desse filho e no encerramento do mesmo (terminated) lê o código de saída (exit code). Quando isso acontece o processo é retirado da tabela de processos (process table) e a vida continua.
No entanto algum bug no código do processo pai pode criar um processo filho mas nunca ler o código de saída do mesmo. Por isso o processo vai estar encerrado (terminated) mas ainda vai constar na tabela de processos.
Um exemplo de como gerar um processo zumbi:
O processo pai cria um filho através de um fork(), mas larga ele lá. Esse processo filho então entra num status , onde ele já encerrou a execução e nada foi feito a respeito da saída dele.
Ao contrário de um processo órfão, um processo zumbi não consome recursos do sistema e – normalmente – não causa problemas. Também são bem fáceis de identificar, basta procurar por processos . Ou também com status Z:
O problema é matar processos zumbis. Como você mata algo que já está morto?
Uma opção – que normalmente não vai funcionar – é descobrir qual o processo pai do zumbi e mandar um SIGCHLD pra ele. (kill -17). Vale tentar, mas não espere muito disso.
A única forma garantida é matar o processo pai. Isso vai fazer com que os processos zumbis virem órfãos, sejam adotados pelo init e esse finalmente vai removê-los da tabela de processos.
Quem aprendeu alguma coisa hoje?