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

48

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, skillund pkillmit verschiedenen Optionen und -9Signal, aber ohne 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:

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

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

Bildbeschreibung hier eingeben

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.

Pedram
quelle
Können Sie die Ausgabe von ps -o pid,ppid,stat,commund pstreezu Ihrer Frage hinzufügen ?
Mikel
Ich habe hier das gleiche Problem und nach dem googeln scheint es, dass dies auftritt, wenn Sie Ihren Home-Ordner während der Installation verschlüsselt haben und Torrents größer als 4 GB herunterladen. Ich habe keinen anderen Weg als einen Neustart gefunden, um den Zombie-Prozess loszuwerden, der 99% der CPU-Kapazität frisst. bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/431975 scheint sich damit zu befassen, aber es scheint nicht viel getan worden zu sein, um dies zu lösen :(
user972876 20.10.11
Bitte lesen Sie auch hier: askubuntu.com/questions/48624/what-are-zombie-processes Dies wird dazu beitragen, viele Zweifel zu lösen.
Luis Alvarado

Antworten:

41

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

kill, skill pkillWird nicht funktionieren , da der Prozess bereits getötet wird, nur , dass es den Eintritt nicht entfernt worden ist.

Der Zombie-Prozess kann beendet werden, indem ein SIGCHLDSignal an die Eltern gesendet wird. Ich denke, die Signalnummer von SIGCHLDist 17oder18

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

Aus Wikipedia über das 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.

Der Eintrag wird also beibehalten, sodass der übergeordnete Prozess den Beendigungsstatus kennen kann, da der übergeordnete Prozess zum Zeitpunkt des Beendens des untergeordneten Prozesses 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 a killall utorrent.exe

Ich kann sehen, dass es zwei Fälle gibt, von denen utorrent.exeeiner Zombie ist. Wahrscheinlich der zweite (Kind). killall sollte die Eltern töten, da das Kind (Zombie) nicht getötet werden kann.


EDIT 4

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

Ausprobieren killall --signal=KILL utorrent.exe

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

Rufen Sie die Liste der Prozess-PID utorrent.exe 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. Prozess-ID 1gehört zu init, ohne die Ihr System nicht ausgeführt werden kann

Manish Sinha
quelle
2
Sie haben geschrieben A zombie process does not take up any resourcesund zitiert the child is still consuming system resources ... it is known as a zombie process.
Maaartinus
Ja. Ich habe den Beitrag aktualisiert, um zu verdeutlichen, was ich meine.
Manish Sinha
7
Der Zombie-Prozess nimmt einen meiner CPU-Kerne vollständig in Anspruch. Die Nutzung dieses Kerns erfolgt zu 100%. Es handelt sich also nicht nur um den Eintrag in der Prozesstabelle. Ich werde der Frage zusätzliche Informationen hinzufügen.
Pedram
3
Ein Zombie, der CPU verwendet, führt möglicherweise Hintergrundthreads aus. Versuchen Sie top -H, Threads anstelle von Prozessen oben anzuzeigen.
Zan Lynx
1
Das Hauptproblem bei defekten Prozessen besteht darin, dass sie weiterhin eventuell verwendete Ports verwenden.
Pietrovismara
10

Die Verwendung killdes Prozesses selbst ist in der Tat ineffektiv, da der Prozess bereits tot ist. killbringt einen Live-Prozess in den Zombie-Zustand.

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

Das Töten des übergeordneten Elements des Zombie-Prozesses ist normalerweise effektiv, da der Zombie-Prozess dann wieder zu initseinem übergeordneten Element wird, sobald das übergeordnete Element nicht mehr vorhanden ist (dh das Töten des übergeordneten Elements hat diesen Prozess in einen Zombie verwandelt und die Großeltern haben den Beendigungscode des übergeordneten Elements gelesen , der Elternteil ist also wirklich weg). 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 winewahrscheinlich 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.

Simon Richter
quelle
Danke für die Information. Aber was ist die Lösung?
Pedram
1
Den eigentlichen übergeordneten Prozess beenden, dh den, der ps wauxin der PPIDSpalte für den Zombie aufgeführt ist.
Simon Richter
Wie Sie in der pstree-Ausgabe sehen können, hat "utorrent.exe" keine übergeordneten Elemente.
Pedram
Es gibt zwei Prozesse mit diesem Namen, wobei einer das Kind des anderen ist. Ich vermute, der Zombie ist das Kind, wodurch der übergeordnete Prozess "utorrent.exe" für die Bereinigung verantwortlich ist. Wenn Sie diesen Prozess abbrechen, räumt init das übergeordnete Element auf. Anschließend wird das untergeordnete Element erneut an init angefügt und sofort bereinigt.
Simon Richter
killall hat in diesem Fall nicht funktioniert. Ich habe µTorrent jetzt gestartet und es hat weder ein Elternteil noch ein Kind, kann aber noch nicht getötet werden. Die Ausgabe von pstree wurde aktualisiert.
Pedram
3

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.

d4m1r
quelle
1

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 -kdann 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 das zusätzliche killall -9oder das kill -9mit der ID des Prozesses.

Luis Alvarado
quelle
Es hat auch nicht geklappt. Ausserdem haben Transmission und ktorrent das gleiche Problem und haben nichts mit Wein zu tun.
Pedram
Ich erwähnte den Teil über die Verwendung von Utorrent, wobei Wein der Elternteil und Utorrent das Kind sind. Wie auch immer, Sie haben versucht, dem Elternteil ein Signal zu senden, das ihm mitteilt, dass sein Kind ein Zombie ist (etwas, zu dem kein Elternteil bereit ist). Zum Beispiel:kill -s SIGCHLD ppid
Luis Alvarado
Auch welche Art von Hardware hast du, um herauszufinden, wie ein Zombie Ressourcen maximal nutzen kann.
Luis Alvarado
Funktioniert leider auch nicht.
Pedram
Mein Prozessor ist Core i7 860.
Pedram
-4

Ich vermute, dass Sie eine SSD verwenden.

Wenn Sie einem Torrent-Client große Torrents hinzufügen, werden die "Platzhalter" -Dateien des Torrents, den Sie herunterladen, tatsächlich auf der Festplatte erstellt, sind jedoch leer, bis sie während des Herunterladevorgangs nach und nach gefüllt werden.

Bei einer normalen Festplatte ist die Festplatte der Engpass, und Sie werden beim Rest Ihres Desktops kein Leistungsproblem bemerken.

Wenn Sie jedoch eine SSD verwenden, ist die CPU der Engpass, und die Anwendung scheint abgestürzt zu sein (wird grau). Wenn Sie es für eine Weile verlassen, wird es sich erholen und alles wird gut. Dies ist meine Erfahrung seit dem Umstieg auf eine SSD.

In Bezug auf Tötungsprozesse haben andere bessere Ratschläge gegeben, als ich kann - das KILL-Signal funktioniert normalerweise, aber ich hatte das eine oder andere, das über die Jahre einen Neustart erforderte.


quelle
1
Danke, aber ich benutze eine normale Festplatte.
Pedram
1
"Wenn Sie jedoch eine SSD verwenden, ist die CPU der Engpass, und die Anwendung scheint abgestürzt zu sein (wird grau). Wenn Sie sie für eine Weile verlassen, wird sie wiederhergestellt und alles wird gut." In dieser Situation ist der Prozess kein Zombie. Zombieprozesse und Prozesse im unterbrechungsfreien Schlaf sind nicht dasselbe. Ein Zombie-Prozess läuft wirklich nicht mehr, beansprucht keine Ressourcen (mit Ausnahme eines einzelnen Eintrags in der Prozesstabelle) und kann niemals wieder zum Leben erweckt werden.
Eliah Kagan