A transmissão está intermitentemente suspensa no meu NAS. Se eu enviar o SIGTERM, ele não desaparecerá da lista de processos e um <defunct>
rótulo aparecerá próximo a ele. Se eu enviar um SIGKILL, ele ainda não desaparece e não consigo finalizar o pai porque ele está init
. A única maneira de me livrar do processo e reiniciar o Transmission é reiniciar.
Percebo que a melhor coisa que posso fazer é tentar corrigir o Transmission (e tentei), mas sou iniciante na compilação e queria garantir que meus torrents terminassem antes de começar a mexer com ele.
init
devem desaparecer rapidamente, poisinit
espera periodicamente as crianças, pois uma de suas muitas tarefas comuns ... é<defunct>
o mesmo que um zumbi?<defunct>
é exatamente o mesmo que um zumbi.init
vai esperar seus filhos para que isso nunca aconteça em teoria. Gostaria de saber o que acontece se você enviar umSIGCHLD
parainit
?Respostas:
Você não pode matar um
<defunct>
processo (também conhecido como processo de zumbi), pois ele já está morto. O sistema mantém processos zumbis para os pais coletarem o status de saída. Se o pai não coletar o status de saída, os processos zumbis permanecerão por toda a eternidade. A única maneira de se livrar desses processos zumbis é matando os pais. Se o pai for init, você poderá reiniciar apenas.Os processos zumbis ocupam quase nenhum recurso; portanto, não há custo de desempenho para deixá-los permanecer. Embora ter processos zumbis por aí geralmente signifique que há um erro em alguns de seus programas. O Init geralmente deve coletar todas as crianças. Se o init tem filhos zumbis, existe um bug no init (ou em algum outro lugar, mas é um bug).
http://en.wikipedia.org/wiki/Zombie_process
fonte
init
nunca pode ter filhos zumbis. Do artigo da wikipedia: Quando um processo perde seu pai, o init se torna seu novo pai. O Init executa periodicamente a chamada do sistema de espera para colher quaisquer zumbis com o init como pai. Uma dasinit
responsabilidades de colher órfãos e zumbis sem pais.init
pode ter erros embora. A substituição do initrunit
teve um erro que causa esse problema.Qualquer um que tentar consertar o código-fonte da Transmissão C deve ler sobre o truque "double fork" para evitar zumbis e manipuladores de sinais ... e como ele pode ser usado como parte de uma função de geração variável inteligente (consulte Desovar no Unix ).
fonte
exit(3)
; os filhos devem ligar em_exit(2)
vez disso (caso contrário, você recebe vários fluxos de stdio, entre outros problemas). # 2: Issoexecvp(3)
poderia usar aperror(3)
se falhar. # 3: Você deve usar emsignal(SIGCHLD, SIG_IGN)
vez de toda essa bagunça.