¿Hay alguna forma de matar un proceso zombie sin reiniciar?

48

¿Hay alguna forma de matar un proceso zombie sin reiniciar? Así es como sucedió:

Quiero descargar un archivo de 12GB usando torrent. Después de agregar el archivo .torrent, la transmisión se convirtió en un proceso zombie (también probé ktorrent. El mismo comportamiento). Finalmente pude descargar el archivo usando µTorrent pero después de cerrar el programa, también se convierte en un zombie.

Intenté usarlo kill, skilly pkillcon diferentes opciones y -9señal, pero no tuve éxito.

Después de leer algunas soluciones en la web, descubrí que matar al padre puede matar al zombi. Pero matar vino tampoco ayudó.

¿Hay otra manera?

Editar:

ps -o pid, ppid, stat, comm

PID  PPID STAT COMMAND
7121  2692 Ss   bash
7317  7121 R+   ps

salida de pstree:

init─┬─GoogleTalkPlugi───4*[{GoogleTalkPlug}]
 ├─NetworkManager─┬─dhclient
 │                └─{NetworkManager}
 ├─acpid
 ├─amarok───19*[{amarok}]
 ├─apache2───5*[apache2]
 ├─atd
 ├─avahi-daemon───avahi-daemon
 ├─bonobo-activati───{bonobo-activat}
 ├─clock-applet
 ├─console-kit-dae───63*[{console-kit-da}]
 ├─cron
 ├─cupsd
 ├─2*[dbus-daemon]
 ├─2*[dbus-launch]
 ├─desktopcouch-se───desktopcouch-se
 ├─firefox───run-mozilla.sh───firefox-bin─┬─plugin-containe───8*[{plugin-contain}]
 │                                        └─14*[{firefox-bin}]
 ├─gconfd-2
 ├─gdm-binary─┬─gdm-simple-slav─┬─Xorg
 │            │                 ├─gdm-session-wor─┬─gnome-session─┬─bluetooth-apple
 │            │                 │                 │               ├─compiz───sh───gtk-window-deco
 │            │                 │                 │               ├─fusion-icon
 │            │                 │                 │               ├─gdu-notificatio
 │            │                 │                 │               ├─gnome-panel───{gnome-panel}
 │            │                 │                 │               ├─gnome-power-man
 │            │                 │                 │               ├─gpg-agent
 │            │                 │                 │               ├─gwibber-service
 │            │                 │                 │               ├─nautilus
 │            │                 │                 │               ├─nm-applet
 │            │                 │                 │               ├─polkit-gnome-au
 │            │                 │                 │               ├─2*[python]
 │            │                 │                 │               ├─qstardict───{qstardict}
 │            │                 │                 │               ├─ssh-agent
 │            │                 │                 │               ├─tracker-applet
 │            │                 │                 │               ├─trackerd
 │            │                 │                 │               ├─wakoopa─┬─wakoopa
 │            │                 │                 │               │         └─3*[{wakoopa}]
 │            │                 │                 │               └─{gnome-session}
 │            │                 │                 └─{gdm-session-wo}
 │            │                 └─{gdm-simple-sla}
 │            └─{gdm-binary}
 ├─6*[getty]
 ├─gnome-keyring-d───2*[{gnome-keyring-}]
 ├─gnome-screensav
 ├─gnome-settings-
 ├─gnome-system-mo
 ├─gnome-terminal─┬─bash───ssh
 │                ├─bash───pstree
 │                ├─gnome-pty-helpe
 │                └─{gnome-terminal}
 ├─gvfs-afc-volume───{gvfs-afc-volum}
 ├─gvfs-fuse-daemo───3*[{gvfs-fuse-daem}]
 ├─gvfs-gdu-volume
 ├─gvfsd
 ├─gvfsd-burn
 ├─gvfsd-computer
 ├─gvfsd-metadata
 ├─gvfsd-trash
 ├─hald─┬─hald-runner─┬─hald-addon-acpi
 │      │             ├─hald-addon-cpuf
 │      │             ├─hald-addon-inpu
 │      │             └─hald-addon-stor
 │      └─{hald}
 ├─indicator-apple
 ├─indicator-me-se
 ├─indicator-sessi
 ├─irqbalance
 ├─kded4
 ├─kdeinit4─┬─kio_http_cache_
 │          └─klauncher
 ├─kglobalaccel
 ├─modem-manager
 ├─multiload-apple
 ├─mysqld───10*[{mysqld}]
 ├─named───10*[{named}]
 ├─nmbd
 ├─notification-ar
 ├─notify-osd
 ├─polkitd
 ├─pulseaudio─┬─gconf-helper
 │            └─2*[{pulseaudio}]
 ├─rsyslogd───2*[{rsyslogd}]
 ├─rtkit-daemon───2*[{rtkit-daemon}]
 ├─smbd───smbd
 ├─snmpd
 ├─sshd
 ├─timidity
 ├─trashapplet
 ├─udevd───2*[udevd]
 ├─udisks-daemon─┬─udisks-daemon
 │               └─{udisks-daemon}
 ├─upowerd
 ├─upstart-udev-br
 ├─utorrent.exe───{utorrent.exe}
 ├─vnstatd
 ├─winbindd───2*[winbindd]
 ├─wnck-applet
 ├─wpa_supplicant
 └─xinetd

El monitor del sistema y la parte superior muestran que el proceso zombie está utilizando recursos:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Edición 2: creo que encontré algo. Traté de cerrar sesión y vi este mensaje:

ingrese la descripción de la imagen aquí

Dado que otros clientes de torrent tienen el mismo problema, tal vez se deba al tamaño del archivo. Estoy usando ubuntu 10.04 en particiones ext4. Matar nautilus y enviarle la señal SIGCHLD no funcionó.

Pedram
fuente
¿Puedes agregar el resultado de ps -o pid,ppid,stat,commy pstreea tu pregunta?
Mikel
Tengo el mismo problema aquí y, después de buscar en Google, parece que esto ocurre cuando encripto su carpeta de inicio durante la instalación y elijo descargar torrents de más de 4 gb. No he podido encontrar otra forma que no sea un reinicio para deshacerme del proceso zombie comiendo 99% de CPU. bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/431975 parece lidiar con esto, pero parece que no se ha hecho mucho para resolver esto :(
user972876
También lea aquí: askubuntu.com/questions/48624/what-are-zombie-processes Esto ayudará a resolver muchas dudas.
Luis Alvarado

Respuestas:

41

No creo que el proceso zombie sea un gran dolor de cabeza. Un proceso zombie no consume ningún recurso. Es solo que tiene su entrada en la tabla de procesos.

Un proceso Zombie no es un proceso huérfano, tiene un padre.

kill, skill pkillno funcionará ya que el proceso ya se ha eliminado, solo que su entrada no se ha eliminado.

El proceso de zombis se puede matar enviando una SIGCHLDseñal al padre. Creo que el número de señal SIGCHLDes 17o18

Si esto también falla, es posible que desee matar al padre mismo.

De Wikipedia en señal SIGCHLD:

Cuando un proceso secundario finaliza antes de que el padre haya llamado a esperar, el núcleo retiene cierta información sobre el proceso para permitir que su padre llame a esperar más tarde. Debido a que el niño todavía consume recursos del sistema pero no lo ejecuta, se conoce como un proceso zombie.


EDITAR 1 : Los recursos del sistema consumidos son principalmente la entrada de la tabla de proceso. Si alguien sabe si consume más que eso: memoria o ciclo de CPU, entonces agregue una explicación. AFAIK apenas ocupa recursos significativos del sistema.


EDITAR 2: Cita de Wikipedia

En los sistemas operativos de computadora Unix y similares a Unix, un proceso zombie o un proceso difunto es un proceso que ha completado la ejecución pero aún tiene una entrada en la tabla de procesos. Esta entrada todavía es necesaria para permitir que el proceso que inició el proceso (ahora zombie) lea su estado de salida.

Por lo tanto, la entrada se mantiene para que el proceso padre pueda conocer el estado de salida porque en el momento en que el niño sale, el padre probablemente no esté en un estado o no esté listo para leer su estado de salida.


EDITAR 3

Hasta la fecha, nunca experimenté un proceso zombie tomando el 100% de la CPU. Al ver esto por primera vez.

Intenta hacer un killall utorrent.exe

Puedo ver que hay dos instancias utorrent.exey una de ellas es zombie. Probablemente el segundo (niño). Killall debería matar al padre ya que el niño (zombie) no puede ser asesinado.


EDITAR 4

Parece que el Killall no funcionó ya que estaba dando una señal TERM en lugar de KILL.

Probar killall --signal=KILL utorrent.exe

Si esto no funciona, intente matar el proceso selectivamente.

Obtenga la lista de PID de proceso utorrent.exe

ps -e | grep -i utorrent

Deberías obtener dos procesos como

xxxx ?        aa:bb:cc utorrent.exe defunct
yyyy ?        aa:bb:cc utorrent.exe

Entonces el segundo es el padre. Mátalo usando

matar -9 aaaa

EDITAR 5

Intenta encontrar el ID principal del proceso con este comando bash

cat / proc / {defunctpid} / status | grep -i ppid

en tu caso es

cat / proc / 7298 / status | grep -i ppid

Si la salida viene como

PPid: 1

Entonces, tristemente, creo que no tienes suerte. El Id. De proceso 1pertenece a init sin el cual su sistema no puede ejecutarse

Manish Sinha
fuente
2
Usted escribió A zombie process does not take up any resourcesy citó the child is still consuming system resources ... it is known as a zombie process.
maaartinus
Sí. Actualicé la publicación para aclarar lo que quería decir.
Manish Sinha
77
El proceso zombie toma uno de mis núcleos de CPU por completo. El uso de ese núcleo está al 100%. Así que no es solo la entrada de la tabla de proceso. Agregaré información adicional a la pregunta.
Pedram
3
Un zombie que usa CPU puede estar ejecutando hilos de fondo. Intente usar top -Hpara mostrar hilos en lugar de procesos en la parte superior.
Zan Lynx
1
El principal problema con los procesos inactivos es que siguen utilizando los puertos eventualmente utilizados.
pietrovismara
10

Usar killel proceso en sí mismo es de hecho ineficaz, ya que el proceso ya está muerto; killtrae un proceso en vivo al estado zombie.

El proceso padre es responsable de recoger el código de salida del proceso; el proceso sigue siendo un zombie hasta que esto se haga. El initproceso recogerá el código de salida de cualquier proceso y lo desechará, por lo que es el padre del "último recurso" el que limpiará a cualquier zombie que sea un descendiente directo.

Matar al padre del proceso zombie generalmente es efectivo porque el proceso zombie luego vuelve a initser su padre tan pronto como el proceso padre desaparece (es decir, matar al padre ha convertido ese proceso en zombie, y el abuelo ha leído el código de salida del padre) , así que el padre realmente se fue). Un zombie puede ser padre de un zombie, por lo que simplemente matar al padre no es suficiente, también debe ser recolectado por otro proceso.

Tenga en cuenta que los procesos nunca son responsables de limpiar a sus nietos: siempre vuelven al proceso 1 como padre (razón por la cual los autores de demonios a veces usan una doble bifurcación () y terminan el proceso en el medio para disociar completamente el proceso hijo de la invocación cáscara)

La razón por la cual matar wineprobablemente no es efectivo es porque no fue realmente el padre del proceso zombie; más bien, el "utorrent.exe" que es un descendiente directo de init es. Sin embargo, este proceso todavía se ejecuta normalmente, simplemente descuida sus deberes.

Simon Richter
fuente
Gracias por la información, pero ¿cuál es la solución?
Pedram
1
Matar el proceso padre real , es decir, el que ps wauxaparece en la PPIDcolumna del zombi.
Simon Richter
Como puede ver en la salida de pstree "utorrent.exe" no tiene ningún padre.
Pedram
Hay dos procesos con ese nombre, donde uno es hijo del otro. Sospecho que el zombie es el niño, lo que haría que el proceso principal "utorrent.exe" sea responsable de la limpieza; si elimina ese proceso, init limpiará al padre, después de lo cual el niño se vuelve a conectar a init y también se limpia inmediatamente.
Simon Richter
killall no funcionó en ese caso. Comencé µTorrent ahora y no tiene ningún padre o hijo, pero aún no se puede matar. La salida del árbol se actualiza.
Pedram
3

Manera mucho más fácil que killall, -9, etc.

1) Use qBitorrent en lugar de la consola uTorrent (también estoy esperando una versión GUI y qBitorrent es esencialmente eso).

2) Si está utilizando 11.04 o superior, presione alt + f2 (abre una ventana de comandos especiales), escriba xkill y su mouse ahora es una x. Haga clic en el programa que desea cerrar (UI = ID de proceso) y lo matará por usted.

Consejo avanzado: enlace un atajo de teclado para "xkill" como lo tengo en mi teclado macro G15.

d4m1r
fuente
1

En mi caso, cuando el vino se cuelga y no puedo matar al niño Zombie con una escopeta, haría:

wineserver -kentonces mataría al "Hijo del Proceso" killall -9 Oblivion.exe(por ejemplo)

Por lo que entiendo, el servidor de vinos envía una señal a todos sus Zombie Childs de que todos van a morir (debido a la escopeta que sabes), pero a veces un niño piensa por sí mismo y quiere conquistar el mundo. Entonces hago el adicional killall -9o kill -9con la identificación del proceso.

Luis Alvarado
fuente
Tampoco funcionó. Además, la transmisión y el ktorrent tienen el mismo problema y no tienen nada que ver con el vino.
Pedram
Mencioné la parte sobre el uso de utorrent con wine siendo wine el padre y utorrent el niño. De todos modos, ¿trataste de enviar una señal al padre para hacerle saber que su hijo es un zombi (Algo para lo que ningún padre está listo). Por ejemplo:kill -s SIGCHLD ppid
Luis Alvarado
Además, ¿qué tipo de hardware tiene, por lo que podría ayudar a descubrir cómo un zombie puede usar los recursos al máximo?
Luis Alvarado
Lamentablemente tampoco funciona.
Pedram
Mi procesador es Core i7 860.
Pedram
-4

Supongo que estás usando una SSD.

Al agregar torrentes grandes a un cliente de torrent, los archivos de "marcador de posición" del torrent que está descargando se crean realmente en el disco, pero están vacíos hasta que se llenan gradualmente durante el proceso de descarga.

Con un disco duro normal, el disco es el cuello de botella y no notará un problema de rendimiento con el resto de su escritorio.

Sin embargo, cuando se utiliza un SSD, la CPU es el cuello de botella y la aplicación parece haberse bloqueado (se vuelve gris). Si lo dejas por un tiempo, se recuperará y todo estará bien. Esta ha sido mi experiencia desde que me cambié a un SSD.

Con respecto a los procesos de eliminación, otros han brindado mejores consejos que yo: el uso de la señal KILL generalmente funciona, pero he tenido el extraño que requirió un reinicio a lo largo de los años.


fuente
1
Gracias, pero estoy usando un disco duro normal.
Pedram
1
"Sin embargo, cuando se usa un SSD, la CPU es el cuello de botella y la aplicación parece haberse bloqueado (se vuelve gris). Si la deja por un tiempo, se recuperará y todo estará bien". En esa situación, el proceso no es un zombie. Los procesos de zombis y los procesos en sueño ininterrumpido no son lo mismo. Un proceso zombie realmente ya no se está ejecutando, no consume recursos (excepto una sola entrada en la tabla de procesos) y nunca puede volver a la vida.
Eliah Kagan