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:

chaves-triste-580x348

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

the_walking_dead_the_complete_first_season_3

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?