Est-il possible de tuer un processus zombie sans redémarrer?

48

Est-il possible de tuer un processus zombie sans redémarrer? Voici comment ça s'est passé:

Je veux télécharger un fichier de 12 Go en utilisant torrent. Après avoir ajouté le fichier .torrent, la transmission s’est transformée en un processus zombie (j’ai aussi essayé ktorrent. Même comportement). Enfin, je pourrais télécharger le fichier en utilisant µTorrent mais après avoir fermé le programme, il se transforme également en zombie.

J'ai essayé d' utiliser kill, skillet pkillavec différentes options et le -9signal , mais sans succès.

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

Y a-t-il un autre moyen?

Modifier:

ps -o pid, ppid, stat, comm

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

pstree sortie:

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

Le moniteur système et le haut indiquent que le processus zombie utilise des ressources:

entrez la description de l'image ici

entrez la description de l'image ici

Edit 2: Je pense avoir trouvé quelque chose. J'ai essayé de me déconnecter et j'ai vu ce message:

entrez la description de l'image ici

Etant donné que d'autres clients torrent ont le même problème, c'est peut-être quelque chose qui concerne la taille du fichier. J'utilise Ubuntu 10.04 sur des partitions ext4. Tuer Nautilus et envoyer un signal à SIGCHLD ne fonctionnait pas.

Pedram
la source
Pouvez-vous ajouter le résultat de ps -o pid,ppid,stat,commet pstreeà votre question?
Mikel
J'ai le même problème ici et après Google, il semble que cela se produise lorsque vous avez crypté votre dossier personnel lors de l'installation et que vous avez choisi de télécharger des torrents de plus de 4 Go. Je n'ai pas été capable de trouver un autre moyen qu'un redémarrage pour me débarrasser du processus de zombie qui consomme 99% de CPU. bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/431975 semble traiter ce problème, mais rien ne semble avoir été fait pour le résoudre :(
user972876
Lisez aussi ici: askubuntu.com/questions/48624/what-are-zombie-processes Ceci vous aidera à résoudre de nombreux doutes.
Luis Alvarado

Réponses:

41

Je ne pense pas que le processus de zombie cause beaucoup de maux de tête. Un processus zombie ne prend aucune ressource. C'est juste qu'il a son entrée dans la table de processus.

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

kill, skill pkillne 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 un SIGCHLDsignal au parent. Je pense que le numéro de signal SIGCHLDest 17ou18

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

De Wikipedia sur le signal SIGCHLD:

Lorsqu'un processus enfant se termine avant que le parent n'ait appelé wait, le noyau conserve des informations sur le processus pour permettre à son parent d'appeler plus tard. Parce que l'enfant consomme toujours des ressources système mais ne l'exécute pas, on parle de processus zombie.


EDIT 1 : Les ressources système utilisées sont principalement l’entrée de la table de processus. Si quelqu'un sait s'il consomme plus que cela - cycle de la mémoire ou du processeur, veuillez ajouter une explication. D’après nos connaissances, cela ne prend pratiquement pas de ressources système significatives.


EDIT 2: Citant sur Wikipedia

Sur les systèmes d'exploitation informatiques Unix et de type Unix, un processus zombie ou un processus obsolète est un processus dont l'exécution est terminée mais qui comporte toujours une entrée dans la table des processus. Cette entrée est toujours nécessaire pour permettre au processus qui a démarré le processus (maintenant zombie) de lire son statut de sortie.

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


EDIT 3

Jusqu'à ce jour, je n'ai jamais expérimenté de processus zombie prenant 100% du processeur. Voyant cela pour la première fois.

Essayez de faire un killall utorrent.exe

Je peux voir qu'il y a deux instances utorrent.exeet l'une d'elles est zombie. Probablement le deuxième (enfant). killall devrait tuer le parent puisque l'enfant (zombie) ne peut pas être tué.


EDIT 4

On dirait que le killall n'a pas fonctionné puisqu'il donnait le signal TERM au lieu de KILL.

Essaie killall --signal=KILL utorrent.exe

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

Obtenir la liste des PID de processus utorrent.exe

ps -e | grep -i utorrent

Vous devriez avoir deux processus comme

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

Donc, le second est le parent. Tuez-le en utilisant

tuer -9 aaaa

EDIT 5

Essayez de trouver l'ID parent du processus à l'aide de cette commande bash

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

dans ton cas c'est

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

Si la sortie vient comme

PPid: 1

Malheureusement, je pense que vous n’avez pas de chance. L'ID de processus 1appartient à init sans lequel votre système ne peut pas s'exécuter

Manish Sinha
la source
2
Vous avez écrit A zombie process does not take up any resourceset cité the child is still consuming system resources ... it is known as a zombie process.
Maaartinus
Ouais. J'ai mis à jour le message pour préciser ce que je voulais dire.
Manish Sinha
7
Le processus zombie prend entièrement l'un de mes cœurs de processeur. L'utilisation de ce noyau est 100%. Donc ce n'est pas seulement l'entrée de la table de processus. J'ajouterai des informations supplémentaires à la question.
Pedram
3
Un zombie utilisant le processeur peut exécuter des threads d'arrière-plan. Essayez d'utiliser top -Hpour afficher les threads au lieu des processus en haut.
Zan Lynx
1
Le problème majeur des processus obsolètes est qu’ils continuent à utiliser les ports éventuellement utilisés.
pietrovismara
10

L'utilisation killdu processus lui-même est en effet inefficace, car le processus est déjà mort; killapporte un processus en direct à 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 initprocessus récupérera le code de sortie de tout 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 redevient initson parent dès que le processus parent est terminé (c’est-à-dire que tuer le parent a transformé ce processus en zombie et que le grand-parent a lu le code de sortie du parent. , donc le parent est vraiment parti). Un zombie peut être le parent d'un zombie. Il ne suffit donc pas de tuer le parent, il doit également être 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 processus invoquant. coquille)

Tuer winen'est probablement pas efficace parce que ce n'est pas vraiment le processus parent du processus zombie; le "utorrent.exe" qui est un descendant direct de init est plutôt. Ce processus, toutefois, continue de fonctionner normalement, négligeant simplement ses tâches.

Simon Richter
la source
Merci pour l'information. Mais quelle est la solution?
Pedram
1
Tuer le processus parent réel , c'est-à-dire celui qui est ps wauxrépertorié dans la PPIDcolonne du zombie.
Simon Richter Le
Comme vous pouvez le voir dans la sortie de pstree, "utorrent.exe" n'a pas de parent.
Pedram
Il existe deux processus portant ce nom, où l’un est l’enfant de l’autre. Je soupçonne que le zombie est l’enfant, ce qui rendrait le processus parent "utorrent.exe" responsable du nettoyage; Si vous supprimez ce processus, init va nettoyer le parent, après quoi l'enfant est rattaché à init et immédiatement nettoyé.
Simon Richter Le
killall ne fonctionnait pas dans ce cas. J'ai démarré µTorrent maintenant et il n'a pas de parent ni d'enfant, mais ne peut pas encore être tué. La sortie pstree est mise à jour.
Pedram
3

Manière beaucoup plus facile que killall, -9, etc:

1) Utilisez qBitorrent à la place de la console uTorrent (j’attends également une version graphique et qBitorrent l’est vraiment).

2) Si vous utilisez la version 11.04 ou une version ultérieure, 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 souhaitez fermer (UI = ID de processus) et il sera tué pour vous.

Conseil avancé: liez un raccourci clavier pour "xkill" comme sur mon clavier macro G15.

d4m1r
la source
1

Dans mon cas, lorsque le vin est suspendu et que je ne peux pas tuer l'enfant Zombie avec un fusil de chasse, je le ferais:

wineserver -kalors je tuerais le "Fils du Processus" killall -9 Oblivion.exe(Par exemple)

Pour ce que je comprends, wineserver envoie un signal à tous ses enfants zombies qu'ils vont tous mourir (à cause du fusil de chasse que vous connaissez), mais parfois, un enfant pense de lui-même et veut prendre le monde par la tempête. Je fais donc le supplément killall -9ou le kill -9avec l'identifiant du processus.

Luis Alvarado
la source
Cela n'a pas fonctionné non plus. En dehors de la transmission et du ktorrent, le même problème existe: ils n'ont rien à voir avec le vin.
Pedram
Je parlais de la partie sur l'utilisation d'utorrent avec le vin étant le vin le parent et l'utorrent l'enfant. Quoi qu'il en soit, avez-vous essayé d'envoyer un signal au parent pour lui faire savoir que son enfant est un zombie (Quelque chose pour lequel aucun parent n'est prêt). Par exemple:kill -s SIGCHLD ppid
Luis Alvarado,
De plus, quel type de matériel avez-vous afin de vous aider à savoir comment un zombie peut utiliser ses ressources au maximum.
Luis Alvarado
Malheureusement, ça ne marche pas non plus.
Pedram
Mon processeur est le noyau i7 860.
Pedram
-4

Je suppose que vous utilisez un disque SSD.

Lors de l'ajout de gros torrents à un client torrent, les fichiers "espaces réservés" du torrent que vous téléchargez sont créés sur le disque, mais sont vides jusqu'à ce qu'ils soient remplis progressivement au cours du processus de téléchargement.

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

Cependant, lors de l'utilisation d'un disque SSD, le processeur est le goulot d'étranglement et l'application semble s'être bloquée (passe en gris). Si vous le laissez pendant un moment, il se remettra et tout ira bien. Cela a été mon expérience depuis le passage à un SSD.

En ce qui concerne les processus de mise à mort, d’autres ont donné de meilleurs conseils que moi. L’utilisation du signal KILL donne généralement satisfaction, mais j’ai eu l’intrépide solution qui a nécessité un redémarrage au fil des ans.


la source
1
Merci, mais j'utilise un disque dur normal.
Pedram
1
"Lors de l'utilisation d'un disque SSD, le processeur est le goulot d'étranglement et l'application semble s'être bloquée (devient grise). Si vous le laissez pendant un certain temps, il va récupérer et tout ira bien." Dans cette situation, le processus n'est pas un zombie. Les processus Zombie et les processus en sommeil ininterruptible ne sont pas la même chose. Un processus zombie ne fonctionne vraiment plus, n'occupe plus de ressources (à l'exception d'une seule entrée dans la table des processus) et ne peut jamais revenir à la vie.
Eliah Kagan