Ist ein persistenter Zombie-Prozess ein Zeichen für einen Fehler?

Ist ein persistenter Zombie-Prozess ein Zeichen für einen Fehler?

(Betriebssystem: Debian-Variante.)

Einen Prozess mit Zombie-Status haben. Der PPidgehörte zu einem gvimProzess. Der Inhalt /proc/[pid]/wchanistdo_exit, /commist shund /cmdlineist leer, /statuswird unten angezeigt.

Könnte dies ein Fehler in sein gvim? Aus dem Wikipedia-Eintrag aufZombie-ProzessIch habe gelesen, dass ein Programm einen Aufruf freiwillig ablehnen kann, waitaber dies betraf eine gvimSitzung, die schon seit einiger Zeit inaktiv war. Ich habe den gvimProzess geschlossen – aber der Zombie lauert immer noch herum. Könnte dies auf einen Betriebssystemfehler hinweisen?

Nochmals aus Wikipedia:

Wenn das übergeordnete Programm nicht mehr ausgeführt wird, weisen Zombie-Prozesse normalerweise auf einen Fehler im Betriebssystem hin.

Und wie oft werden aufgegebene Prozesse wiederbelebt? Seit dem Ableben initsind mindestens 60 Minuten vergangen, aber es ist immer noch da.gvim

Andererseits könnte es so sein shund nicht gvim?

Der/status DateiZustände SigQvon Null.

$ less /proc/30339/status
Name     : sh
State    : Z (zombie)
Tgid     : 30339
Pid      : 30339
PPid     : 29673
TracerPid:     0
Uid      :  1000    1000    1000    1000
Gid      :  1000    1000    1000    1000
FDSize   :     0
Groups   :     4 7 20 24 27 29 30 46 107 124 127 1000 
Threads  :     1
SigQ     : 0/30658
SigPnd   : 0000000000000000
ShdPnd   : 0000000000000000
SigBlk   : 0000000000000000
SigIgn   : 0000000000003001
SigCgt   : 0000000000010002
CapInh   : 0000000000000000
CapPrm   : 0000000000000000
CapEff   : 0000000000000000
CapBnd   : ffffffffffffffff
Cpus_allowed     :   3
Cpus_allowed_list:   0-1
Mems_allowed     :   1
Mems_allowed_list:   0
voluntary_ctxt_switches   :   2
nonvoluntary_ctxt_switches:   3

Nicht, dass es meinen Schönheitsschlaf zerstört, aber ich frage mich …

Antwort1

Das Anzeigen von Zombies deutet in der Regel auf einen Fehler im Prozess hin, der sie erzeugt hat: Dieser Prozess soll die Zombies ernten (durch Aufrufen von wait) oder explizit ignorieren SIGCLD(oder das SA_NOCLDWAITFlag setzen).

Dies ist jedoch ein kleiner Fehler. Zombie-Prozesse verbrauchen nur einen Eintrag in der Prozesstabelle, was eine vernachlässigbare Menge an Ressourcen darstellt. Das Problem wird nur dann signifikant, wenn ein Prozess Tausende von Zombies hinterlässt.

Sie haben den übergeordneten Prozess des Zombies nicht beendet, sonst wäre der Zombie verschwunden. Prozess 29673 (der übergeordnete Prozess des Zombies) ist noch aktiv (aber nicht waitaktiv). Entweder ist dies nicht Gvim, sondern ein Unterprozess davon, oder Sie haben ein Gvim-Fenster geschlossen, aber das Programm läuft noch. Führen Sie es aus, ps l 29673um zu sehen, was dieser Prozess ist.

Antwort2

Wenn Sie ständig auf einen Zombie-Prozess stoßen, würde ich eher annehmen, dass definitiv etwas nicht stimmt. Zombie-Prozesse kommen vor. Ich sehe im Allgemeinen jeden Monat ein paar davon auf den verschiedenen Systemen, die ich bei der Arbeit und zu Hause betreue.

Normalerweise sind sie auf einen Bedienfehler oder ein Problem mit einer bestimmten Software zurückzuführen. Ein Neustart behebt sie normalerweise und sie treten normalerweise für einige Zeit nicht wieder auf.

Wenn Sie Probleme damit haben, können Sie versuchen, sich mit ihrer übergeordneten Prozess-ID (PPID) zu verbinden, gdbum herauszufinden, was los ist, oder sogar versuchen, sie zu beenden:

$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit

Wenn Sie dazu bereit sind, würde ich mir die folgenden zusätzlichen Ressourcen durchlesen, um weitere Techniken zum Umgang mit ihnen kennenzulernen.

Verweise

Antwort3

Passiert das jedes Mal, wenn Sie gvim verwenden? Funktioniert gvim, abgesehen davon, dass es nach dem Beenden einen Zombie hinterlässt? Sofern es keine echten Probleme verursacht, würde ich es einfach ignorieren – Zombies belasten die Systemressourcen nicht. Es würde mich nicht überraschen, wenn es ein Fehler in gvim wäre – oder vielleicht in gtk, aber sofern das Programm nicht überhaupt nicht funktioniert, würde ich es ignorieren.

Ein Zombie-/nicht mehr funktionierender Prozess entsteht normalerweise, wenn ein Kindprozess beendet wird, bevor der übergeordnete Prozess beginnt, auf ihn zu hören. Der Kindprozess „bleibt“, weil kein Programm da war, das seinen Beendigungsstatus empfangen konnte, obwohl er zufriedenstellend beendet wurde – daher wird er zu einem Zombie. Ein weiterer Grund für Zombies kann sein, wenn ein großer Prozessbaum zusammenbricht – möglicherweise, weil jemand versucht hat, einen oder mehrere Prozesse im Baum zu beenden.

Ein Zombie ist eigentlich eine Möglichkeit für das Betriebssystem, den Beendigungsstatus und andere Informationen über einen Prozess, der nicht ganz korrekt beendet wurde, beizubehalten, falls es jemanden interessiert. Abgesehen von einem Eintrag in der Prozesstabelle verbraucht ein Zombie keine Ressourcen (also weder Speicher noch CPU).

Meiner bescheidenen Meinung nach liegt WikiPedia falsch – oder ist zumindest leicht misszuverstehen – wenn es behauptet, dass nicht geerntete Zombies einen Fehler im Betriebssystem bedeuten, wenn sie nach dem Beenden des Hauptprozesses, durch den sie erzeugt wurden, noch vorhanden sind. Es ist nicht ungewöhnlich, dass ein Zombie seine Eltern überlebt. In diesem Fall wird er von init(PID 1) adoptiert. initkann ihn eventuell ernten, aber einige Zombies – sogar die von init adoptierten – können durchaus bis zum Neustart bestehen bleiben. Solange Sie nicht so viele Zombies haben, dass sie die Prozesstabelle füllen, stellen sie kaum ein Problem dar.

Natürlich sind Zombies oft ein Zeichen dafür, dass etwas nicht stimmt – dass ein Programm ein Kind erzeugt, das früher als erwartet stirbt – aber das Problem muss nicht unbedingt das Betriebssystem sein. Es können aber durchaus auch Betriebssystemkomponenten sein, die das Problem verursachen – z. B. führt ein fehlender oder falsch konfigurierter Soundserver dazu, dass ein Kindprozess, der den Sound für ein Programm verarbeiten soll, sofort beendet wird und somit als Zombie bestehen bleibt.

Antwort4

Wie immer kommt es darauf an. Die meisten Überwachungstools werden gelb oder rot, wenn sie mehr als eine bestimmte Anzahl von Zombie-Prozessen feststellen.

Grundsätzlich ist es also normalerweise ein Anzeichen für ein Problem.

Aber ich habe Programme gesehen, die im Rahmen ihrer „normalen“ Operationen Zombie-Prozesse erzeugten. Diese Zombie-Prozesse verschwanden, als die entsprechende Top-Level-API (ich sage hier nicht übergeordneter Prozess) mit dem Befehl „quit/exit“ aufgerufen wurde.

In diesen Fällen scheint sich die Anwendung um diese Zombies gekümmert zu haben (und sie vielleicht auch gebraucht zu haben). Zur Überwachung musste ich also eine Ausnahme auf den Servern definieren, auf denen diese Anwendungen liefen.

In anderen Fällen verschwanden die Zombies nach kurzer Zeit – daher kann es bei Zombie-Prozessen zu bestimmten nicht persistenten Systemzuständen kommen.

In Ihrem Fall: Wenn gvimdies erledigt ist, sollte kein Zombie mehr übrig sein – also wahrscheinlich ein Fehler.

verwandte Informationen