2008-12-10 13 views
48

tengo un proceso desaparecida en mi sistema:Matar un proceso desaparecida en el sistema UNIX

abc  22093 19508 0 23:29 pts/4 00:00:00 grep ProcA 
abc  31756  1 0 Dec08 ?  00:00:00 [ProcA_my_collect] <defunct> 

¿Cómo puedo matar el proceso anterior, y sin un reinicio de la máquina? Lo he intentado con

kill -9 31756 
sudo kill -9 31756 
+0

El hecho de que el identificador del proceso padre es 1 significa que todo lo que se inició está muerto. No estoy seguro de por qué "init" aún no lo ha cosechado. –

+0

¡Eso es un zombie! No te preocupes, no es dañino y no consume nada. – Loki

+3

Acabo de ver eso en reddit: http://www.cs.cornell.edu/Courses/cs414/2007sp/tanenbaum.jpg – Loki

Respuesta

39

Has matado al proceso de , pero un proceso inactivo no desaparece de la tabla de procesos hasta que su proceso principal realiza una tarea llamada "cosecha" (esencialmente llamando al wait(3) para que ese proceso lea su estado de salida). Los procesos muertos que no se han cosechado se llaman "zombie processes".

El ID del proceso principal que ve para 31756 es el id. De proceso 1, que siempre pertenece a init. Ese proceso debería cosechar sus procesos zombies periódicamente, pero si no puede, seguirán siendo zombies en la tabla de proceso hasta que reinicies.

+3

Init definitivamente cosecha niños muertos. Piense en las implicaciones de que eso no sea cierto: todo proceso de un niño tendría que terminar antes que su padre. – janm

+1

Reiniciar init puede ayudar - en Linux, telinit u debería ser capaz de hacer eso. – bdonlan

+7

Esa última oración es completamente incorrecta. ¡Cosechar niños es prácticamente lo * único * que hace init! –

0

Probablemente no podrá si matar al padre no lo resuelve. Por alguna razón, los sistemas no están recopilando ese proceso zombie.

FWIW, lo he visto bastante en el SCO Openserver boxen que solía administrar. Uso intensivo de múltiples usuarios y bajos recursos del sistema, pero no pareció doler nada. Solo me molestó. :)

22

¿verificó si había un proceso hijo que pueden necesitar ser matado por primera vez? A veces, el atasco de arriba es abajo de la línea ... Trate ps -ef --forest

a ver lo que puede ser por debajo de ella (si acaso) y luego matar a la primera, a continuación, de la que ya sabe acerca de

6

Si kill -9 no puede matar un proceso, la causa casi siempre es un error del controlador o del sistema operativo.

El proceso init ha adoptado el proceso, pero no se puede cosechar. Es decir: cuando init llama espera (2) ese proceso no se devuelve. Uno de los propósitos principales de init es cosechar a los niños huérfanos muertos, por lo que el problema no es que su padre murió antes de ser cosechado. Piense: De lo contrario, ¿quién recoge los resultados de un proceso nohup después de cerrar la sesión?

Es poco probable que matar a los hijos del proceso extinto ayude a menos que estén relacionados de alguna manera con el error en particular que estás viendo.

+1

"Si kill -9 no puede matar un proceso, la causa casi siempre es un error del controlador o del sistema operativo". Esto es cierto, excepto por un proceso difunto. kill -9 no va a hacer nada para un proceso extinto, solo envía un mensaje de SIGKILL al kernel sobre el proceso, pero el kernel no administra la tabla de proceso sobre la base de esta señal. – benc

+0

@benc: estoy de acuerdo, un proceso zombie ya está muerto y no morirá más en respuesta a SIGKILL. Sin embargo, el resto de mi respuesta permanece: Parece que hay un error que hace que este proceso no sea cosechado por init cuando llama a wait(). – janm

0

El proceso probablemente cuelga en, por ejemplo ignorando señales como SIGPIPE, verifique con strace -p <pid> lo que está sucediendo aquí.

Cuestiones relacionadas