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

45

Est-il possible de tuer un processus de 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 est devenue 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 la fermeture du programme, il se transforme également en zombie.

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

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

Y a-t-il une autre façon?

Modifier:

ps -o pid, ppid, stat, comm

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

sortie 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

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

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

Comme les autres clients torrent ont le même problème, c'est peut-être quelque chose à propos de la taille du fichier. J'utilise ubuntu 10.04 sur les partitions ext4.     

posée Pedram 18.03.2011 - 10:11
la source

5 réponses

37

Je ne pense pas que le processus de zombies soit un mal de tête. Un processus zombie n'utilise aucune ressource. C'est juste qu'il a son entrée dans la table des processus.

Un processus Zombie n’est pas un processus orphelin, mais un parent.

kill , skill pkill ne fonctionnera pas car le processus est déjà supprimé, mais uniquement que l'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 pouvez vouloir tuer le parent lui-même.

De Wikipedia sur le signal SIGCHLD:

  

Lorsqu'un processus enfant se termine avant   le parent a appelé wait, le noyau   conserve quelques informations sur le   processus pour permettre à son parent d'appeler   attend plus tard. Parce que l'enfant est   toujours consommer des ressources système mais   ne pas l'exécuter est connu comme un zombie   processus.

EDIT 1 : les ressources système consommées sont principalement l’entrée de la table de processus. Si quelqu'un sait si cela consomme plus que cela - le cycle de la mémoire ou du processeur, alors s'il vous plaît ajouter une explication. AFAIK ne prend guère de ressources système significatives.

ÉDITER 2: Citer sur Wikipedia

  

Sur les ordinateurs Unix et Unix   systèmes d'exploitation, un processus zombie ou   processus disparu est un processus qui a   terminé l'exécution mais a toujours un   entrée dans la table de processus. Cette entrée   est toujours nécessaire pour permettre le processus   qui a lancé le processus (maintenant zombie)   pour lire son état de sortie.

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

EDIT 3

Jusqu'à ce jour, je n'ai jamais connu un processus de zombie prenant 100% du processeur. En voyant cela pour la première fois.

Essayez de faire killall utorrent.exe

Je peux voir qu'il y a deux instances de utorrent.exe et que 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 un 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.

Obtenez la liste des processus PID 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

Le second est donc le parent. Tuez-le en utilisant

  

tuer -9 aaaa

EDIT 5

S'il vous plaît essayez de trouver l'ID parent du processus par cette commande bash

  

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

dans votre cas, c'est

  

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

Si la sortie est comme

  

PPid: 1

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

    
réponse donnée Manish Sinha 18.03.2011 - 11:52
la source
9

L'utilisation de 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 va chercher le code de sortie de tout processus et le jette, c'est donc le parent "dernier recours" qui nettoie tout zombie qui est un descendant direct.

Tuer le parent du processus zombie est généralement efficace car le processus zombie revient à init en tant que parent dès que le processus parent est parti (par exemple, tuer le parent a transformé ce processus en zombie et le grand-parent a lu le code de sortie du parent, donc le parent est vraiment parti). Un zombie peut être parent d'un zombie, donc le simple fait de tuer le parent n'est pas suffisant, il doit également être collecté par un autre processus lui-même.

Notez que les processus ne sont jamais responsables du nettoyage de leurs petits-enfants - ils reviennent toujours au processus 1 en tant que parent (ce qui explique pourquoi les auteurs de démons utilisent parfois un double fork () et mettent fin au processus du shell invoquant)

La raison pour laquelle le fait de tuer wine n’est probablement pas efficace est qu’il n’était pas vraiment le parent du processus zombie; plutôt, le "utorrent.exe" qui est un descendant direct de init est. Ce processus est toujours en cours d'exécution, tout en négligeant ses devoirs.

    
réponse donnée Simon Richter 18.03.2011 - 15:10
la source
3

Beaucoup plus facile que killall, -9, etc.:

1) Utilisez plutôt qBitorrent à la place de la console uTorrent (j'attends aussi une version avec interface graphique et qBitorrent en fait).

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 (interface utilisateur = identifiant de processus) et cela le tuera.

Astuce avancée: liez un raccourci clavier pour "xkill" comme sur mon clavier G15.

    
réponse donnée d4m1r 20.10.2011 - 20:01
la source
1

Dans mon cas, quand le vin se bloque 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 de Wineerver envoie un signal à tous ses Zombie Childs, ils vont tous mourir (à cause du fusil de chasse que vous connaissez) mais parfois un enfant pense par lui-même et veut prendre le monde d'assaut. Je fais donc le killall -9 ou le kill -9 avec l'id du processus.

    
réponse donnée Luis Alvarado 18.03.2011 - 16:56
la source
-4

Je suppose que vous utilisez un SSD.

Lors de l’ajout de gros torrents à un client torrent, les fichiers "placeholder" du torrent que vous téléchargez sont réellement créés sur le disque, mais sont vides jusqu’à ce qu’ils soient progressivement remplis pendant le 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, lorsque vous utilisez un disque SSD, le processeur est le goulot d’étranglement et l’application semble avoir planté (devient gris). Si vous le quittez pendant un certain temps, il se rétablira 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 fourni de meilleurs conseils que moi - l’utilisation du signal KILL fonctionne généralement, mais j’ai eu l’étrange qui nécessitait un redémarrage au fil des ans.

    
réponse donnée user12746 21.03.2011 - 07:59
la source

Lire d'autres questions sur les étiquettes