La transmission est suspendue par intermittence sur mon NAS. Si j'envoie SIGTERM, il ne disparaît pas de la liste des processus et une <defunct>
étiquette apparaît à côté. Si j'envoie un SIGKILL, il ne disparaît toujours pas et je ne peux pas terminer le parent parce que le parent l'est init
. La seule façon de me débarrasser du processus et de redémarrer la transmission est de redémarrer.
Je me rends compte que la meilleure chose que je puisse faire est d'essayer de réparer Transmission (et j'ai essayé), mais je suis un novice dans la compilation et je voulais m'assurer que mes torrents se terminaient avant de commencer à jouer avec.
init
devraient disparaître assez rapidement carinit
attend périodiquement les enfants comme l'une de ses nombreuses tâches courantes ... est<defunct>
la même chose qu'un zombie?<defunct>
est exactement la même chose qu'un zombie.init
attendra ses enfants donc cela ne devrait jamais arriver en théorie. Je me demande ce qui se passe si vous envoyez unSIGCHLD
àinit
?Réponses:
Vous ne pouvez pas tuer un
<defunct>
processus (également appelé processus zombie) car il est déjà mort. Le système conserve les processus zombies pour que le parent collecte l'état de sortie. Si le parent ne collecte pas le statut de sortie, les processus zombies resteront pour toujours. La seule façon de se débarrasser de ces processus zombies est de tuer le parent. Si le parent est init, vous ne pouvez que redémarrer.Les processus zombies ne prennent presque pas de ressources, il n'y a donc aucun coût de performance à les laisser s'attarder. Bien qu'avoir des processus zombies signifie généralement qu'il y a un bug dans certains de vos programmes. Init devrait généralement recueillir tous les enfants. Si init a des enfants zombies, il y a un bogue dans init (ou quelque chose d'autre mais c'est un bogue).
http://en.wikipedia.org/wiki/Zombie_process
la source
init
ne peut jamais avoir d'enfants zombies. De l'article de wikipedia: Lorsqu'un processus perd son parent, init devient son nouveau parent. Init exécute périodiquement l'appel système wait pour récolter tous les zombies avec init comme parent. L'une deinit
ses responsabilités est de récolter des orphelins et des zombies sans parents.init
peut cependant avoir des bugs. Le remplacement initrunit
a eu un bogue qui provoque ce problème.Quiconque essaie de corriger le code source de Transmission C devrait lire l'astuce "double fork" pour éviter les zombies et les gestionnaires de signaux ... et comment il peut être utilisé dans le cadre d'une fonction d'apparition variadique intelligente (voir Spawning sous Unix ).
la source
exit(3)
; les enfants doivent appeler à la_exit(2)
place (sinon vous obtenez plusieurs vidages stdio, entre autres). # 2: Celaexecvp(3)
pourrait utiliser un enperror(3)
cas d'échec. # 3: Vous devez simplement utiliser à lasignal(SIGCHLD, SIG_IGN)
place de tout ce gâchis.