50 votes

Existe-t-il un moyen de tuer un processus zombie sans redémarrage ?

Existe-t-il un moyen de tuer un processus zombie sans redémarrage ? Voici comment cela s'est passé :

Je souhaite télécharger un fichier de 12 Go à l'aide d'un torrent. Après avoir ajouté le fichier .torrent, la transmission s'est transformée en processus zombie (j'ai essayé ktorrent aussi. Même comportement). Finalement, j'ai pu télécharger le fichier en utilisant µTorrent, mais après avoir fermé le programme, il s'est également transformé en processus zombie.

J'ai essayé d'utiliser kill , skill y pkill avec différentes options et -9 mais sans succès.

Après avoir lu quelques solutions sur le web, j'ai découvert que tuer le parent peut tuer le zombie. Mais tuer Wine n'a pas aidé non plus.

Existe-t-il un autre moyen ?

Edita:

ps -o pid,ppid,stat,comm

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

sortie pstree :

initGoogleTalkPlugi4*[{GoogleTalkPlug}]
 NetworkManagerdhclient
                 {NetworkManager}
 acpid
 amarok19*[{amarok}]
 apache25*[apache2]
 atd
 avahi-daemonavahi-daemon
 bonobo-activati{bonobo-activat}
 clock-applet
 console-kit-dae63*[{console-kit-da}]
 cron
 cupsd
 2*[dbus-daemon]
 2*[dbus-launch]
 desktopcouch-sedesktopcouch-se
 firefoxrun-mozilla.shfirefox-binplugin-containe8*[{plugin-contain}]
                                         14*[{firefox-bin}]
 gconfd-2
 gdm-binarygdm-simple-slavXorg
                              gdm-session-worgnome-sessionbluetooth-apple
                                                              compizshgtk-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
                                                              wakoopawakoopa
                                                                       3*[{wakoopa}]
                                                              {gnome-session}
                                               {gdm-session-wo}
                              {gdm-simple-sla}
             {gdm-binary}
 6*[getty]
 gnome-keyring-d2*[{gnome-keyring-}]
 gnome-screensav
 gnome-settings-
 gnome-system-mo
 gnome-terminalbashssh
                 bashpstree
                 gnome-pty-helpe
                 {gnome-terminal}
 gvfs-afc-volume{gvfs-afc-volum}
 gvfs-fuse-daemo3*[{gvfs-fuse-daem}]
 gvfs-gdu-volume
 gvfsd
 gvfsd-burn
 gvfsd-computer
 gvfsd-metadata
 gvfsd-trash
 haldhald-runnerhald-addon-acpi
                    hald-addon-cpuf
                    hald-addon-inpu
                    hald-addon-stor
       {hald}
 indicator-apple
 indicator-me-se
 indicator-sessi
 irqbalance
 kded4
 kdeinit4kio_http_cache_
           klauncher
 kglobalaccel
 modem-manager
 multiload-apple
 mysqld10*[{mysqld}]
 named10*[{named}]
 nmbd
 notification-ar
 notify-osd
 polkitd
 pulseaudiogconf-helper
             2*[{pulseaudio}]
 rsyslogd2*[{rsyslogd}]
 rtkit-daemon2*[{rtkit-daemon}]
 smbdsmbd
 snmpd
 sshd
 timidity
 trashapplet
 udevd2*[udevd]
 udisks-daemonudisks-daemon
                {udisks-daemon}
 upowerd
 upstart-udev-br
 utorrent.exe{utorrent.exe}
 vnstatd
 winbindd2*[winbindd]
 wnck-applet
 wpa_supplicant
 xinetd

Le moniteur système et le top montrent que le processus zombie utilise des ressources :

enter image description here

enter image description here

Editer 2 : Je crois que j'ai trouvé quelque chose. J'ai essayé de me déconnecter et j'ai vu ce message :

enter image description here

J'utilise ubuntu 10.04 sur des partitions ext4. tuer nautilus et lui envoyer le signal SIGCHLD n'a pas fonctionné.

44voto

saniul Points 2595

Je ne pense pas que le processus des zombies soit un véritable casse-tête. Un processus zombie ne prend pas de ressources. C'est juste qu'il a son entrée dans la table des processus.

Un processus zombie n'est pas un processus orphelin, il a un parent.

kill , skill pkill ne fonctionnera pas puisque le processus est déjà tué, mais que son entrée n'a pas été supprimée.

Le processus zombie peut être tué en envoyant SIGCHLD signal aux parents. Je pense que le numéro de signal de SIGCHLD es 17 o 18

Si cela échoue également, vous pouvez tuer le parent lui-même.

Extrait de Wikipedia sur le signal SIGCHLD :

Lorsqu'un processus enfant te que le processus parent n'ait appelé wait, le noyau conserve certaines informations sur le afin de permettre à son parent d'appeler wait plus tard. Comme le processus enfant est toujours en train de consommer des ressources système mais ne s'exécute pas, il est appelé processus zombie. zombie.


EDIT 1 : Les ressources système consommées sont principalement les entrées de la table des processus. Si quelqu'un sait s'il consomme plus que cela - de la mémoire ou du cycle du processeur, merci d'ajouter une explication. AFAIK, il ne consomme pratiquement pas de ressources système significatives.


EDIT 2 : Citation de Wikipedia

Sur les systèmes d'exploitation Unix et Unix-like un processus zombie ou un processus processus défunt est un processus qui a terminé son exécution mais qui possède toujours une dans la table des processus. Cette entrée est encore nécessaire pour permettre au processus qui démarre de lire son état de sortie.

L'entrée est donc conservée pour que le processus parent puisse connaître l'état de sortie, car au moment où l'enfant quitte le processus, le processus parent n'est probablement pas en état ou prêt à lire son état de sortie.


EDIT 3

Jusqu'à présent, je n'ai jamais eu affaire à un processus zombie prenant 100 % du CPU. C'est la première fois que je vois cela.

Essayez de faire un killall utorrent.exe

Je constate qu'il y a deux instances de utorrent.exe et l'un d'entre eux est un zombie. Probablement le second (l'enfant). killall devrait tuer le parent puisque l'enfant (zombie) ne peut pas être tué.


EDIT 4

Il semble que le killall n'ait pas fonctionné puisqu'il émettait un signal TERM au lieu d'un signal KILL.

Essai killall --signal=KILL utorrent.exe

Si cela ne fonctionne pas, essayez de tuer le processus de manière sélective.

Obtenir la liste des processus PID de utorrent.exe

ps -e | grep -i utorrent

Vous devriez obtenir deux processus comme

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

Le deuxième est donc le parent. Il faut le tuer en utilisant

kill -9 yyyy

EDIT 5

Essayez de trouver l'identifiant parent du processus à l'aide de la commande bash suivante

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

dans votre cas est

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

Si le résultat est le suivant

PPid : 1

Dans ce cas, je pense que vous n'avez pas de chance. Id processus 1 appartient à init sans lequel votre système ne peut pas fonctionner

10voto

Simon Richter Points 3021

Utilisation kill sur le processus lui-même est en effet inefficace, puisque le processus est déjà mort ; kill fait passer un processus actif à l'état de zombie.

Le processus parent est chargé de récupérer le code de sortie du processus ; le processus reste un zombie jusqu'à ce que cela soit fait. Le processus init récupérera le code de sortie de n'importe quel processus et le jettera, c'est donc le parent de "dernier recours" qui nettoiera tout zombie qui est un descendant direct.

Tuer le parent du processus zombie est généralement efficace car le processus zombie revient alors à l'état de init comme son parent dès que le processus parent a disparu (c'est-à-dire que le parent a transformé ce processus en zombie et que le grand-parent a lu le code de sortie du parent, de sorte que le parent est vraiment parti). Un zombie peut être le parent d'un autre zombie, il ne suffit donc pas de tuer le parent, il faut aussi qu'il soit collecté par un autre processus.

Notez que les processus ne sont jamais responsables du nettoyage de leurs petits-enfants -- ils reviennent toujours au processus 1 en tant que parent (c'est pourquoi les auteurs de démons utilisent parfois un double fork() et terminent le processus au milieu pour dissocier complètement le processus enfant du Shell qui l'invoque).

La raison pour laquelle tuer wine n'est probablement pas efficace parce qu'il n'était pas vraiment le parent du processus zombie ; c'est plutôt le "utorrent.exe" qui est un descendant direct d'init. Ce processus continue cependant à fonctionner normalement, mais il néglige ses tâches.

3voto

d4m1r Points 31

Beaucoup plus facile que killall, -9, etc :

1) Utiliser qBitorrent au lieu de la console uTorrent (j'attends aussi une version GUI et qBitorrent est essentiellement cela).

2)Si vous utilisez 11.04 ou plus, appuyez sur alt+f2 (ouvre une fenêtre de commandes spéciales), tapez xkill et votre souris est maintenant un x. Cliquez sur le programme que vous voulez fermer (UI = process ID) et il le tuera pour vous.

Astuce avancée : créez un raccourci clavier pour "xkill" comme je l'ai fait sur mon clavier macro G15.

1voto

Bob Points 940

Dans mon cas, lorsque Wine se bloque et que je ne peux pas tuer l'enfant zombie avec un fusil, je ferais.. :

wineserver -k Ensuite, je tuerais le "fils du processus". killall -9 Oblivion.exe (Par exemple)

D'après ce que j'ai compris, le serveur de vins envoie un signal à tous ses enfants zombies pour leur dire qu'ils vont tous mourir (à cause du fusil de chasse, vous savez), mais parfois un enfant pense par lui-même et veut prendre le monde d'assaut. Je fais donc ce qui suit killall -9 ou le kill -9 avec l'identifiant du processus.

-4voto

Je pense que vous utilisez un disque SSD.

Lorsque vous ajoutez des torrents volumineux à un client torrent, les fichiers "placeholder" du torrent que vous téléchargez sont créés sur le disque, mais restent vides jusqu'à ce qu'ils soient progressivement remplis au cours du processus de téléchargement.

Avec un disque dur normal, le disque est le goulot d'étranglement et vous ne remarquerez pas de problème de performance avec le reste de votre bureau.

Toutefois, lorsqu'on utilise un disque SSD, le processeur est le goulot d'étranglement et l'application semble s'être arrêtée (elle devient grise). Si vous l'abandonnez pendant un certain temps, elle se rétablira et tout ira bien. C'est ce que j'ai constaté depuis que j'ai opté pour un disque SSD.

En ce qui concerne l'arrêt des processus, d'autres ont fourni de meilleurs conseils que moi - l'utilisation du signal KILL fonctionne généralement, mais il m'est arrivé, au fil des ans, de devoir redémarrer un processus.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X