web-dev-qa-db-fra.com

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

Est-il possible de tuer un processus zombie sans redémarrer? Voici comment cela 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, skill et pkill avec différentes options et -9 signal 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?

Edit:

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:

enter image description here

enter image description here

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

enter image description here

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.

48
Pedram

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.

killname__, skillpkillne fonctionnera pas car le processus est déjà arrêté, mais son entrée n'a pas été supprimée.

Le processus zombie peut être tué en envoyant le signal SIGCHLDau parent. Je pense que le numéro de signal de SIGCHLDest 17 ou 18

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

sur Wikipedia signal SIGCHLD:

Lorsqu'un processus enfant se termine avant que le parent n'ait appelé wait, le noyau conserve certaines 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 dès l'instant 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 existe deux instances de uTorrent.exe et 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.

Essayez 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 1 appartient à init sans lequel votre système ne peut pas s'exécuter

41
Manish Sinha

Utiliser killsur le processus lui-même est en effet inefficace, car le processus est déjà mort; killamène un processus en direct à l'état 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 initré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 alors initdè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 la sortie du parent. code, 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 qu'il n'était 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.

10
Simon Richter

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 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.

3
d4m1r

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 -k alors 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, vous savez), mais parfois, un enfant pense de lui-même et veut prendre le monde par la tempête. Donc, je fais le killall -9 supplémentaire ou le kill -9 avec l'identifiant du processus.

1
Luis Alvarado