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, 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:
Edit 2: Ich denke, ich habe etwas gefunden. Ich habe versucht, mich abzumelden und diese Nachricht gesehen:
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.
ps -o pid,ppid,stat,comm
undpstree
zu Ihrer Frage hinzufügen ?Antworten:
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
pkill
Wird 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
SIGCHLD
Signal an die Eltern gesendet wird. Ich denke, die Signalnummer vonSIGCHLD
ist17
oder18
Wenn dies ebenfalls fehlschlägt, möchten Sie möglicherweise das übergeordnete Element selbst töten.
Aus Wikipedia über das SIGCHLD-Signal:
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
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.exe
einer 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
Sie sollten zwei Prozess wie bekommen
Der zweite ist also der Elternteil. Töte es mit
EDIT 5
Versuchen Sie, die Parent-ID des Prozesses mit diesem Bash-Befehl zu ermitteln
in deinem fall ist
Wenn der Ausgang wie kommt
Dann denke ich leider, dass Sie kein Glück haben. Prozess-ID
1
gehört zu init, ohne die Ihr System nicht ausgeführt werden kannquelle
A zombie process does not take up any resources
und zitiertthe child is still consuming system resources ... it is known as a zombie process
.top -H
, Threads anstelle von Prozessen oben anzuzeigen.Die Verwendung
kill
des Prozesses selbst ist in der Tat ineffektiv, da der Prozess bereits tot ist.kill
bringt 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
init
Prozess 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
init
seinem ü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
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.quelle
ps waux
in derPPID
Spalte für den Zombie aufgeführt ist.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.
quelle
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ötenkillall -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 -9
oder daskill -9
mit der ID des Prozesses.quelle
kill -s SIGCHLD ppid
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