La transmisión se cuelga intermitentemente en mi NAS. Si envío SIGTERM, no desaparece de la lista de procesos y <defunct>
aparece una etiqueta al lado. Si envío un SIGKILL, todavía no desaparece y no puedo terminar el padre porque el padre es init
. La única forma en que puedo deshacerme del proceso y reiniciar la transmisión es reiniciando.
Me doy cuenta de que lo mejor que puedo hacer es probar y reparar la Transmisión (y lo he intentado), pero soy un novato en la compilación y quería asegurarme de que mis torrents terminen antes de comenzar a jugar.
init
deberían desaparecer bastante rápido ya queinit
espera a los niños periódicamente como una de sus muchas tareas comunes ... ¿es<defunct>
lo mismo que un zombi?<defunct>
es exactamente lo mismo que un zombie.init
esperará a sus hijos para que esto nunca suceda en teoría. Me pregunto ¿qué ocurre si se envía unSIGCHLD
ainit
?Respuestas:
No puedes matar un
<defunct>
proceso (también conocido como proceso zombie) ya que ya está muerto. El sistema mantiene procesos zombies para que el padre recopile el estado de salida. Si el padre no recopila el estado de salida, los procesos zombie permanecerán para siempre. La única forma de deshacerse de esos procesos zombies es matando al padre. Si el padre es init, solo puede reiniciar.Los procesos de zombis casi no requieren recursos, por lo que no hay costo de rendimiento al permitir que permanezcan. Aunque tener procesos zombies alrededor generalmente significa que hay un error en algunos de sus programas. Init generalmente debe recoger a todos los niños. Si init tiene hijos zombis, entonces hay un error en init (o en otro caso, pero es un error).
http://en.wikipedia.org/wiki/Zombie_process
fuente
init
nunca puede tener hijos zombies. Del artículo de Wikipedia: Cuando un proceso pierde a su padre, init se convierte en su nuevo padre. Init ejecuta periódicamente la llamada al sistema de espera para cosechar zombies con init como padre. Una deinit
las responsabilidades es cosechar huérfanos y zombies sin padres.init
aunque puede tener errores. El reemplazo de initrunit
ha tenido un error que causa este problema.Cualquiera que intente arreglar el código fuente de la Transmisión C debería leer sobre el truco del "doble tenedor" para evitar zombis y manejadores de señales ... y cómo se puede usar como parte de una función inteligente de generación varódica (ver Generación en Unix ).
fuente
exit(3)
; los niños deberían llamar en su_exit(2)
lugar (de lo contrario, obtendrá múltiples descargas estándar, entre otros problemas). # 2: Esoexecvp(3)
podría usar aperror(3)
si falla. # 3: Deberías usar ensignal(SIGCHLD, SIG_IGN)
lugar de todo este desastre.