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?
kill -9
?747
y29971
son procesos zombies. Los otros pueden estar encerrados pero aún no están muertos.Respuestas:
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 clone
comando. 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 unaSIGTERM
ySIGINT
no va a funcionar.Para matarlo, en este caso, desea utilizar la
-9
opción de línea de comando. Esto significa enviar laSIGKILL
señal. Realmente puedes usar-KILL
también.Para obtener una lista de señales disponibles, use la opción de línea de comando de lista.
Esto le muestra los números y los nombres (y verá que # 9 dice SIGKILL).
fuente
kill -KILL
fue 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 todosNo 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
SIGCHLD
a 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):(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 deinit
las principales tareas para heredar cualquier huérfano y hacerlowait(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.fuente
SIGCHLD
, no hay zombie Sería creado. Entonces, si no se ignoraSIGCHLD
, 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 esgit 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.SIG_DFL
) paraSIGCHILD
también es ignorarlo, pero en este caso los zombis ciertamente no se cosechan automáticamente.SIG_DFL
) paraSIGCHILD
tambié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 enviarSIGCHLD
a un proceso que tiene suSIGCHLD
controlador configuradoSIG_IGN
(ya sea explícitamente o por defecto) hará que ese proceso coseche zombis.SIGCHLD
puede 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.para buscar procesos zombie:
para matar el proceso zombie, las ID de los padres deben eliminarse, es decir, PPID:
fuente
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 ()".
fuente