Forma alternativa de matar un proceso zombie

19

Acabo de notar algunos procesos zombies en CentOS 6.8 (Final), intenté matarlos pero todavía están allí:

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     20776 20669  0 09:03 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

[root@host user]# kill 746 747 29970 29971

[root@host user]# ps -ef | grep git
tomcat     746     1  0 Jul18 ?        00:00:00 git clone https://github.com/angular/bower-angular.git -b v1.3.20 --progress . --depth 1
tomcat     747   746  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>
root     21525 20669  0 09:26 pts/3    00:00:00 grep git
tomcat   29970     1  0 Jul18 ?        00:00:00 git clone https://github.com/components/jqueryui.git -b 1.12.0 --progress . --depth 1
tomcat   29971 29970  0 Jul18 ?        00:00:00 [git-remote-http] <defunct>

Como puede ver, están funcionando durante dos meses, y también, si no son dañinos, me desharía de ellos, ¿alguna forma alternativa de matar a un zombi?

lese
fuente
1
has intentado kill -9?
Ipor Sircer
77
Solo 747y 29971son procesos zombies. Los otros pueden estar encerrados pero aún no están muertos.
roaima
Parece que tienes un error en algún código que se ejecuta en Tomcat ...
Boris the Spider

Respuestas:

8

Como mencionó Heemayl, en realidad no puedes matar a un zombie. Ya está [no] muerto ...

Sin embargo, el problema que enfrenta parece un problema con el git clonecomando. Se atasca de alguna manera. ¿Probablemente caduca o falla de alguna otra manera? A menudo es debido a alguna de E / S que un proceso se queda atascado en el punto en que una SIGTERMy SIGINTno va a funcionar.

Para matarlo, en este caso, desea utilizar la -9opción de línea de comando. Esto significa enviar la SIGKILLseñal. Realmente puedes usar -KILLtambién.

[root@host user]# kill -KILL 746 29970

Para obtener una lista de señales disponibles, use la opción de línea de comando de lista.

[root@host user]# kill -l

Esto le muestra los números y los nombres (y verá que # 9 dice SIGKILL).

Alexis Wilke
fuente
1
En realidad, kill -KILLfue el único comando capaz de cerrar estos procesos, por esta razón voy a aceptar la respuesta de @Alexis Wilke. Pero seguramente me gustaría expresar mi gratitud a la respuesta rápida, sabia y muy informativa @heemayl +1. Gracias a todos
lese
39

No puedes matar a un zombi (proceso), ya está muerto. Solo está esperando que su proceso padre lo haga wait(2)y recopile su estado de salida. No tomará ningún recurso en el sistema que no sea una entrada de tabla de proceso.

Puede enviarlo SIGCHLDa su padre para informarle que uno de sus hijos ha finalizado (es decir, solicitarle que recopile el estado de salida del niño). Esta señal se puede ignorar (que es la predeterminada):

kill -CHLD <PPID>

(Reemplace <PPID>con el PID real del padre).

O puede matar el proceso padre para que init(PID 1) herede el proceso zombie y lo coseche correctamente (es una de initlas principales tareas para heredar cualquier huérfano y hacerlo wait(2)regularmente). Pero no se recomienda matar a los padres. En general, la creación de procesos zombies indica problemas / problemas de programación y, en su lugar, debe intentar solucionarlos o informarlos.

heemayl
fuente
8
Puede enviar SIGCHLD a su padre para hacerle saber que uno si sus hijos han terminado (es decir, solicitarle que recopile el estado de salida del niño), esta señal se puede ignorar (predeterminado) El problema con eso es que si un proceso ignora SIGCHLD, no hay zombie Sería creado. Entonces, si no se ignora SIGCHLD, y los zombis no se están cosechando, el proceso es defectuoso o no se preocupa por los niños zombis. Dado que el proceso en cuestión es git clone ..., apuesto a que simplemente no le importan los niños zombis, ya que es un proceso (con suerte) de corta duración que hace su trabajo y luego sale.
Andrew Henle
1
@AndrewHenle: Si bien eso es principalmente cierto, la acción predeterminada ( SIG_DFL) para SIGCHILDtambién es ignorarlo, pero en este caso los zombis ciertamente no se cosechan automáticamente.
R ..
@R Aunque eso es mayormente cierto, la acción predeterminada ( SIG_DFL) para SIGCHILDtambién es ignorarlo, pero en este caso los zombis ciertamente no se cosechan automáticamente. No estoy seguro de a qué te refieres. ¿Te refieres a los procesos que no se obtienen en la pregunta? No veo cómo enviar SIGCHLDa un proceso que tiene su SIGCHLDcontrolador configurado SIG_IGN(ya sea explícitamente o por defecto) hará que ese proceso coseche zombis.
Andrew Henle
1
@AndrewHenle, enviar un mensaje SIGCHLDpuede funcionar esta vez . La última vez que pudo haber perdido la señal o dos niños murieron al mismo tiempo y el código no es lo suficientemente inteligente como para manejar ambas muertes simultáneamente.
Alexis Wilke
No puede doler, pero no pondría probabilidades de que funcione.
Barmar
2

para buscar procesos zombie:

ps aux | grep -w Z | grep -v grep

ps -eo stat,ppid | grep -w Z

para matar el proceso zombie, las ID de los padres deben eliminarse, es decir, PPID:

kill PPID1 PPID2

kill $(ps -eo stat,ppid|grep -w Z|awk '{print $2}'|tr "\n" " ")
usuario218243
fuente
0

Cuando un proceso padre muere, todo el proceso zombie se limpiará. No mates el proceso principal solo para limpiar el proceso zombie. Volverá de nuevo cuando vuelva a ejecutar su programa. Arregle su programa con una llamada adecuada al sistema "wait ()" o "waitpid ()".

Sumanth S
fuente