Como posso matar um processo defunto cujo pai é init?

27

A transmissão está intermitentemente pendurada no meu NAS. Se eu enviar o SIGTERM, ele não desaparecerá da lista de processos e um rótulo <defunct> aparecerá ao lado dele. Se eu enviar um SIGKILL, ele ainda não desaparecerá e eu não posso finalizar o pai porque o pai é init . A única maneira de me livrar do processo e reiniciar o Transmission é reinicializar.

Eu percebo que a melhor coisa que posso fazer é tentar corrigir o Transmission (e eu tentei), mas eu sou um novato na compilação e queria ter certeza de que meus torrents terminaram antes de começar a brincar com ele. / p>     

por Andy E 12.04.2011 / 16:02

2 respostas

35

Você não pode matar um processo <defunct> (também conhecido como zumbi) já que ele já está morto. A única razão pela qual o sistema mantém os processos zumbis é manter o status de saída para o pai coletar. Se o pai não coletar o status de saída, os processos de zumbis permanecerão para sempre. A única maneira de se livrar desses processos zumbis é matando os pais. Se o pai é init, então você só pode reinicializar.

link

    
por 12.04.2011 / 16:31
6

Qualquer um que tente consertar o código-fonte da Transmissão C deve ler sobre o truque "duplo garfo" para evitar zumbis e manipuladores de sinais ... e como ele pode ser usado como parte de uma função de desova variável inteligente (veja Desenvolvimento no Unix ).

excerpt from: 
   "Spawning in Unix", http://lubutu.com/code/spawning-in-unix

Double fork
This trick lets you spawn processes whilst avoiding zombies, without 
installing any signal handler. The first process forks and waits for its 
child; the second process forks and immediately exits and is reaped;
the third process is adopted by init, and executes the desired program. 
All zombies accounted for, since init is always waiting.

if(fork() == 0) {
   if(fork() == 0) {
       execvp(file, argv);
       exit(EXIT_FAILURE);
   }
   exit(EXIT_SUCCESS);
}
wait(NULL);
    
por 03.06.2012 / 17:46