¿Qué es un proceso zombie y cómo lo mato?

Respuestas:

17

¡Oh Dios! No no no. No uses kill -9.

No le da al proceso la oportunidad de limpiar:

  1. apague las conexiones del zócalo

  2. limpiar archivos temporales

  3. informar a sus hijos que se va

  4. restablecer sus características de terminal y así sucesivamente y así sucesivamente.

En general, envíe 15 y espere un segundo o dos, y si eso no funciona, envíe 2, y si eso no funciona, envíe 1. Si eso no funciona, ¡QUITE EL BINARIO porque el programa se comportó mal!

No uses kill -9. No saque la cosechadora solo para ordenar la maceta.

Severe_admin
fuente
13
kill -9 no matará zombies. Tienes que matar a sus padres, mira a pstree.
LapTop006
3
@ LapTop006: En ese caso, son más como vampiros; mata al vampiro principal para detener la invasión.
anfetamáquinas
2
Esta respuesta es incorrecta en casi todos los sentidos. El proceso esta completo; ya ha cerrado sus conexiones, limpiado archivos temporales, etc. etc. Ya no hay un proceso real, solo una entrada en la tabla de procesos. No elimine el binario secundario: no se comporta mal. Simplemente significa que el padre aún no ha celebrado un funeral adecuado para su hijo.
Ken Williams
19

El proceso de zombis (en realidad ahora se llaman <defunct>) no es realmente un proceso. Es solo una entrada en la tabla de procesos, por lo que el proceso padre puede hacer wait()syscall .

No deberías preocuparte por ellos. No ocupan ningún recurso, desaparecerán cuando su padre llame wait()cuando el padre muera.

vartec
fuente
9

Sin embargo, ya hay una respuesta aceptada: PUEDES matar el proceso zombie. Adjunte con el depurador al proceso padre y llame a la función waitpid. Por ejemplo: supongamos que el padre tiene PID = 100, el proceso zombie tiene PID = 200

$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit
ondra
fuente
Interesante. Intentaré esto
ewwhite
8

Un proceso zombie no tiene recursos asignados, aparte de la entrada en el árbol de procesos. Esto sucede cuando se completa un proceso, sin embargo, el proceso padre aún no lo ha cosechado (es decir, waiteditado en él).

Puede intentar forzar al padre a hacer esto si lo desea enviándole un SIGCHLD ( kill -20), al padre, pero no hay garantía de que el padre lo respete.

A menudo los verá durante cortos períodos de tiempo (por ejemplo, mientras ve el árbol de procesos usando la parte superior); esto es normal; En el intervalo de tiempo entre el momento en que se completa un proceso secundario y el padre lo encuesta, el proceso secundario aparecerá como un zombi.

Sin embargo, si ve procesos zombis que existen continuamente, lo que no es normal, todavía no hay necesidad de preocuparse, ya que no hay recursos asignados a un proceso inactivo, generalmente significa que la aplicación está mal escrita por desarrolladores desagradables.

El único momento en el que deberías preocuparte por los procesos zombie es cuando ves muchos, por ejemplo, si la misma aplicación de mierda mencionada anteriormente se coloca bajo carga.

Tenemos muchos desarrolladores malos donde trabajo, por lo que tengo el privilegio de lidiar con tales problemas y aprender todo tipo de cosas inútiles mientras lo hago. De hecho, mi equipo a menudo recurre al uso de los scripts de shell de mierda escritos por los desarrolladores de mierda en las entrevistas, si el candidato puede elegir que el script es realmente malo y decirnos por qué es malo, tiene un buen pie en la puerta.

Jerjes
fuente
0

En cuanto a la escopeta virtual ...

$ shoot <pid>
#! / bin / sh
víctima = `ps -e -o pid, ppid | egrep "^ \ s * $ 1 \ b" | awk '{print $ 2}' '
víctima \ _name = `ps -e -o pid, cmd | egrep "^ \ s * $ {victim} \ b" | cabeza -n 1 | awk '{print $ 2}' '
#kill $ {victim}
echo "Asesinado $ {victim_name}".

Y recuerda: siempre dispara en la cabeza.

Drybjed
fuente
Lo siento, pero para el registro, este script tiene un error tipográfico "victim_name" y va a matar al padre del PID dado en $ 1, en cualquier caso considera si PID es el único zombie o si tiene algunos hermanos, simplemente mata al padre y con él toda la familia perecerá.
Marc Riera
-1

Un proceso zombie es un proceso que ha terminado de ejecutarse, pero que todavía aparece en la tabla de procesos.

kill -9 [parent process_name] lo colocará, con prejuicios extremos.

Alan
fuente
kill -9 no matará a un proceso zombie, esa es una razón por la que se llaman zombies. Un "proceso" zombie no desaparecerá hasta que su código de retorno sea cosechado por un proceso padre.
Mei
3
No, kill -9 en EL PADRE va a matar al padre, por lo que init de los padres, que SE cosechar código de retorno del niño.
Alan