it-swarm.com.de

Gibt es eine Möglichkeit, einen Zombie-Prozess ohne Neustart zu beenden?

Gibt es eine Möglichkeit, einen Zombie-Prozess ohne Neustart zu beenden? So ist es passiert:

Ich möchte eine 12-GB-Datei mit Torrent herunterladen. Nach dem Hinzufügen der .torrent-Datei verwandelte sich die Übertragung in einen Zombie-Prozess (ich habe auch ktorrent ausprobiert. Dasselbe Verhalten). Endlich konnte ich die Datei mit µTorrent herunterladen, aber nach dem Schließen des Programms verwandelt sie sich ebenfalls in einen Zombie.

Ich habe versucht, kill, skill und pkill mit verschiedenen Optionen und -9 Signal zu verwenden, aber kein Erfolg.

Nachdem ich einige Lösungen im Internet gelesen hatte, fand ich heraus, dass das Töten der Eltern den Zombie töten kann. Aber das Töten von Wein half auch nicht.

Gibt es eine andere Art und Weise?

Bearbeiten:

ps -o pid, ppid, stat, comm

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

pstree-Ausgabe:

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

Der Systemmonitor und die Oberseite zeigen, dass der Zombie-Prozess Ressourcen verwendet:

enter image description here

enter image description here

Edit 2: Ich glaube, ich habe etwas gefunden. Ich habe versucht, mich abzumelden und diese Nachricht gesehen:

enter image description here

Da andere Torrent-Clients das gleiche Problem haben, hängt es möglicherweise mit der Dateigröße zusammen. Ich verwende Ubuntu 10.04 auf ext4-Partitionen. Das Töten von Nautilus und das Senden des SIGCHLD-Signals funktionierte nicht.

48
Pedram

Ich glaube nicht, dass Zombie-Prozesse Kopfschmerzen bereiten. Ein Zombie-Prozess beansprucht keine Ressourcen. Es ist nur so, dass es seinen Eintrag in der Prozesstabelle hat.

Ein Zombie-Prozess ist kein verwaister Prozess, sondern hat einen übergeordneten Prozess.

kill, skillpkill funktioniert nicht, da der Prozess bereits beendet wurde, nur dass sein Eintrag nicht entfernt wurde.

Der Zombie-Prozess kann durch Senden des Signals SIGCHLD an die Eltern beendet werden. Ich denke, die Signalnummer von SIGCHLD ist 17 oder 18

Wenn dies ebenfalls fehlschlägt, möchten Sie möglicherweise das übergeordnete Element selbst töten.

Von Wikipedia auf SIGCHLD-Signal:

Wenn ein untergeordneter Prozess beendet wird, bevor der übergeordnete Prozess wait aufgerufen hat, behält der Kernel einige Informationen zum Prozess bei, damit der übergeordnete Prozess wait später aufrufen kann. Da das Kind immer noch Systemressourcen verbraucht, diese aber nicht ausführt, spricht man von einem Zombie-Prozess.


EDIT 1 : Die verbrauchten Systemressourcen sind meist der Prozesstabelleneintrag. Wenn jemand weiß, ob es mehr als das verbraucht - Speicher oder CPU-Zyklus, dann fügen Sie bitte eine Erklärung hinzu. AFAIK nimmt kaum nennenswerte Systemressourcen in Anspruch.


EDIT 2: Zitat aus Wikipedia

Unter Unix- und Unix-ähnlichen Computer-Betriebssystemen ist ein Zombie-Prozess oder ein nicht mehr funktionierender Prozess ein Prozess, dessen Ausführung abgeschlossen wurde, der jedoch noch einen Eintrag in der Prozesstabelle enthält. Dieser Eintrag wird weiterhin benötigt, damit der Prozess, der den (jetzt Zombie-) Prozess gestartet hat, seinen Beendigungsstatus lesen kann.

Daher wird der Eintrag beibehalten, sodass der übergeordnete Prozess den Beendigungsstatus kennen kann, da der übergeordnete Prozess zum Zeitpunkt des Beendigungsvorgangs wahrscheinlich nicht in einem Status ist oder nicht bereit ist, den Beendigungsstatus zu lesen.


EDIT 3

Bis jetzt habe ich noch nie einen Zombie-Prozess erlebt, der 100% der CPU beansprucht. Das zum ersten Mal sehen.

Versuchen Sie es mit einem killall uTorrent.exe

Ich kann sehen, dass es zwei Instanzen von uTorrent.exe gibt und eine davon ist Zombie. Wahrscheinlich der zweite (Kind). killall sollte die Eltern töten, da das Kind (Zombie) nicht getötet werden kann.


EDIT 4

Sieht so aus, als hätte der Killall nicht funktioniert, da er TERM-Signal anstelle von KILL gab.

Probiere killall --signal=KILL uTorrent.exe aus

Wenn dies nicht funktioniert, versuchen Sie, den Prozess selektiv zu beenden.

Rufen Sie die Liste der uTorrent.exe-Prozess-PID ab

ps -e | grep -i uTorrent

Sie sollten zwei Prozess wie bekommen

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

Der zweite ist also der Elternteil. Töte es mit

töte -9 jjjj

EDIT 5

Versuchen Sie, die Parent-ID des Prozesses mit diesem Bash-Befehl zu ermitteln

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

in deinem fall ist

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

Wenn der Ausgang wie kommt

PPid: 1

Dann denke ich leider, dass Sie kein Glück haben. Die Prozess-ID 1 gehört zu init, ohne die Ihr System nicht ausgeführt werden kann

41
Manish Sinha

Die Verwendung von kill für den Prozess selbst ist in der Tat ineffektiv, da der Prozess bereits tot ist. kill versetzt einen Live-Prozess in den Zombie-Status.

Der übergeordnete Prozess ist dafür verantwortlich, den Beendigungscode des Prozesses abzurufen. Der Prozess bleibt ein Zombie, bis dies erledigt ist. Der init -Prozess nimmt den Exit-Code eines Prozesses auf und wirft ihn weg. Es ist also der "letzte Ausweg" -Elternteil, der jeden Zombie bereinigt, der ein direkter Nachkomme ist.

Das Töten des Elternteils des Zombieprozesses ist normalerweise effektiv, da der Zombieprozess dann zu init als dessen Elternteil zurückkehrt, sobald der Elternprozess weg ist (dh das Töten des Elternteils hat diesen Prozess in einen Zombie verwandelt, und der Großelternteil hat dies getan) Lesen Sie den Beendigungscode der Eltern, damit die Eltern wirklich verschwunden sind. Ein Zombie kann Eltern eines Zombies sein. Das bloße Töten des Elternteils reicht also nicht aus, es muss auch von einem anderen Prozess selbst eingesammelt werden.

Beachten Sie, dass Prozesse niemals für die Bereinigung ihrer Enkelkinder verantwortlich sind - sie kehren immer zu Prozess 1 als übergeordnetem Element zurück (weshalb Daemon-Autoren manchmal einen doppelten Zweig verwenden () und den Prozess in der Mitte beenden, um den untergeordneten Prozess vollständig vom aufrufenden Prozess zu trennen Schale)

Der Grund, warum das Töten von wine wahrscheinlich nicht effektiv ist, liegt darin, dass es nicht wirklich das Elternteil des Zombieprozesses war. Vielmehr ist die "uTorrent.exe", die ein direkter Nachkomme von init ist. Dieser Prozess läuft jedoch normal weiter und vernachlässigt nur seine Pflichten.

10
Simon Richter

Viel einfacher als killall, -9, etc:

1) Verwenden Sie qBitorrent anstelle der Konsole uTorrent (ich warte auch auf eine GUI-Version und qBitorrent ist es im Wesentlichen).

2) Wenn Sie 11.04 oder höher verwenden, drücken Sie Alt + F2 (öffnet ein Fenster mit speziellen Befehlen), geben Sie xkill ein und Ihre Maus ist jetzt ein x. Klicken Sie auf das Programm, das Sie schließen möchten (UI = Prozess-ID), und es wird für Sie beendet.

Erweiterter Tipp: Binden Sie eine Tastenkombination für "xkill", wie ich sie auf meiner G15-Makrotastatur habe.

3
d4m1r

In meinem Fall, wenn Wein hängt und ich das Zombie-Kind nicht mit einer Schrotflinte töten kann, würde ich Folgendes tun:

wineserver -k dann würde ich den "Sohn des Prozesses" töten killall -9 Oblivion.exe (Zum Beispiel)

Nach meinem Verständnis sendet wineserver ein Signal an alle seine Zombie-Kinder, dass sie alle sterben werden (aufgrund der Schrotflinte, die Sie kennen), aber manchmal denkt ein Kind von selbst und möchte die Welt im Sturm erobern. Also mache ich den zusätzlichen killall -9 oder den kill -9 mit der ID des Prozesses.

1
Luis Alvarado