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:
Edit 2: Je pense avoir trouvé quelque chose. J'ai essayé de me déconnecter et j'ai vu ce message:
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.
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
name__, skill
pkill
ne 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 SIGCHLD
au parent. Je pense que le numéro de signal de SIGCHLD
est 17
ou 18
Si cela échoue également, vous voudrez peut-être tuer le parent lui-même.
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.
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
Utiliser kill
sur le processus lui-même est en effet inefficace, car le processus est déjà mort; kill
amè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 init
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 alors init
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 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 wine
n'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.
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.
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.