¿Cómo matar un proceso que no se puede matar sin reiniciar?

11

Hay 5 procesos que no se pueden eliminar kill -9 $PIDy la ejecución cat /proc/$PID/cmdlinebloqueará la sesión actual. Tal vez son procesos zombies.

La ejecución ps -ef or htoptambién colgará la sesión actual. Pero topy ps -eestán funcionando bien.

Parece que hay dos problemas que el sistema de archivos no responde.

Esta es una máquina de producción que ejecuta máquinas virtuales, por lo que reiniciar no es una opción.

Los siguientes ID de procesos no funcionan: 16181 16765 5985 7427 7547

El padre de estos procesos es init

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

Y uno de los procesos qemu no funciona

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)
Sam Stoelinga
fuente
1
Los procesos de zombis no deberían causar un problema. Si el número de procesos de Zombie es tan grande que excede el límite del proceso en el servidor, entonces causará un problema.
Raza
@Salton: No podemos usar ps -ef y htop, así que tenemos algunos problemas, ¿tal vez lo que estamos viendo no se llama proceso zombie?
Sam Stoelinga 01 de
1
Puede intentar rastrear usando /usr/bin/strace ps -efpara ver dónde ps -efse cuelga exactamente su .
Raza
2
¿Cómo determinaste que estos son zombies? Esto más bien parece procesos colgantes. ¿ ps -elFunciona y en qué estado se encuentran estos procesos?
Nils
Al final, el cliente aún decidió reiniciar la máquina ya que los problemas empeoraban cada vez más. Gracias por todo el aporte. Aprendí mucho sobre zombis y procesos ininterrumpibles.
Sam Stoelinga

Respuestas:

22

No tienes zombies. cat /proc/$PID/cmdlineNo tendría ningún problema con un zombie. Si kill -9no mata el programa , significa que el programa está haciendo una operación de E / S ininterrumpida. Eso generalmente indica una de tres cosas:

  • un sistema de archivos de red que no responde;
  • un error del kernel;
  • un error de hardware

Las utilidades como pspueden bloquearse si intentan leer alguna información, como la ruta ejecutable del proceso, que el núcleo no proporciona por una de las razones anteriores.

Intenta cat /proc/16181/syscallver qué proceso está haciendo 16181. Esto puede o no funcionar dependiendo de qué tan lejos esté su sistema.

Si el problema es un sistema de archivos de red, es posible que pueda desmontarlo por la fuerza o ponerlo en línea. Si el problema es un error de kernel o hardware, lo que puede hacer dependerá de la naturaleza del error. Se recomienda encarecidamente reiniciar (y actualizar a un kernel fijo, o reemplazar el hardware dañado).

Gilles 'SO- deja de ser malvado'
fuente
Cat nunca responde. No creo que esto sea un error. Creo que es una "característica".
Búho
7

Las otras respuestas suponen que estos son procesos zombies. Un proceso zombie es un proceso que ha terminado de ejecutarse, pero todavía está en la tabla de procesos en caso de que el padre quiera saber el estado de salida. Estos son normales y initlimpiarán automáticamente los procesos zombies que se le asignen.

Los procesos de zombis nunca deberían hacer que algo se cuelgue, por lo que parece que ese no es su problema. Si se trata de una llamada del sistema o un controlador bloqueado, el proceso puede estar en un estado ininterrumpido. Hay una buena explicación aquí .

David Baggerman
fuente
Demasiados procesos zombies pueden evitar forktener éxito (cuando nrpocse alcanza el nivel difícil ) porque todavía ocupan espacio en la tabla de procesos.
dhchdhd
2

Para encontrar procesos zombie en Linux:

$ ps axo stat, ppid, pid, comm | grep -w difunto

Z 555 10242 Maldición-Zombi <difunto>

Primero, puedes intentar enviar la señal SIGCHLD al proceso padre del zombie usando el comando kill. Tenga en cuenta que el comando anterior le proporciona PPID (PID del proceso principal) de cada zombie. En nuestro ejemplo, PPID del zombie es 555.

$ sudo kill -s SIGCHLD 555

Si un proceso zombie aún no desaparece, puedes matar el proceso padre (p. Ej., 555) del zombie.

$ sudo kill -9 555

Una vez que su proceso principal es eliminado, el zombie será adoptado por el proceso init, que es el principal de todos los procesos en Linux. El proceso init llama periódicamente wait()para cosechar cualquier proceso zombie.

JamónEl AstroChimp
fuente
Esta es la verdadera respuesta. Matar a los padres funcionó, gracias.
Andrew
1

Solo puedes matar a un zombie matando a su padre. Un proceso zombie ha liberado todos sus recursos y está esperando que su estado de salida sea recogido por su padre. Se convierte en un zombie cuando el padre no ejecuta un waitpara recoger el estado de salida de su hijo. Cuando matas al padre del zombi, inittoma el estado de salida y el zombi finalmente muere.

unxnut
fuente
¿Entonces quieres que mate a init? No está claro por la pregunta, lo siento, jeje, pero el padre parece ser init :( He editado la pregunta.
Sam Stoelinga
44
No, queremos que no intentes matar al zombie. No puedes matar a un zombie. Esta pregunta frecuente es tan antigua como el propio Unix.
tripleee
@tripleee: Sí, eso es lo que entendí. Tal vez lo que estoy teniendo no es un zombie. htop no funciona y cat / proc / $ pid / cmdline o ls / proc / $ pid / tampoco funciona. Normalmente esto no sucede con zombies, por eso pregunté aquí, este no es un problema común. He comprobado varias respuestas que le dicen que mate al padre, que es init en mi caso o que reinicie.
Sam Stoelinga 01 de
1
"Matar al padre" es la forma de cosechar un zombie normal. No puedes matar init. Si un zombie se repare debajo init, no puedes matarlo.
tripleee