Wie kann ich einen Prozess beenden, der ohne Neustart nicht beendet werden kann?


11

Es gibt 5 Prozesse, die nicht beendet werden können, kill -9 $PIDund die Ausführung cat /proc/$PID/cmdlinehängt die aktuelle Sitzung. Vielleicht sind es Zombie-Prozesse.

Durch Ausführen ps -ef or htopwird auch die aktuelle Sitzung angehalten . Aber topund ps -efunktionieren gut.

Es scheint also zwei Probleme zu geben, auf die das Dateisystem nicht reagiert.

Dies ist eine Produktionsmaschine, auf der virtuelle Maschinen ausgeführt werden. Ein Neustart ist daher nicht möglich.

Die folgenden Prozess-IDs funktionieren nicht: 16181 16765 5985 7427 7547

Das übergeordnete Element dieser Prozesse ist init

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

Und einer der Qemu-Prozesse funktioniert nicht

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)

1
Zombie-Prozesse sollten kein Problem verursachen. Wenn die Anzahl der Zombie-Prozesse so groß ist, dass das Prozesslimit auf dem Server überschritten wird, tritt ein Problem auf.
Raza

@Salton: Wir können ps -ef und htop nicht verwenden, daher haben wir einige Probleme. Vielleicht wird das, was wir sehen, nicht als Zombie-Prozess bezeichnet?
Sam Stoelinga

1
Sie können versuchen zu verfolgen, indem Sie verwenden, um /usr/bin/strace ps -efzu sehen, wo genau Ihre ps -efhängt.
Raza

2
Wie haben Sie festgestellt, dass es sich um Zombies handelt? Das sieht eher nach hängenden Prozessen aus. Funktioniert ps -elund in welchem ​​Zustand befinden sich diese Prozesse?
Nils

Am Ende entschied sich der Client immer noch, den Computer neu zu starten, da die Probleme immer schlimmer wurden. Vielen Dank für alle Beiträge. Ich habe viel über Zombies und unterbrechungsfreie Prozesse gelernt.
Sam Stoelinga

Antworten:


22

Du hast keine Zombies. cat /proc/$PID/cmdlinehätte kein Problem mit einem Zombie. Wenn kill -9das Programm nicht beendet wird , bedeutet dies, dass das Programm einen unterbrechungsfreien E / A-Vorgang ausführt. Das weist normalerweise auf eines von drei Dingen hin:

  • ein Netzwerk-Dateisystem, das nicht reagiert;
  • ein Kernel-Bug;
  • ein Hardware-Fehler.

Dienstprogramme wie pskönnen hängen bleiben, wenn sie versuchen, Informationen wie den ausführbaren Pfad des Prozesses zu lesen, den der Kernel aus einem der oben genannten Gründe nicht bereitstellt.

Versuchen Sie cat /proc/16181/syscallzu sehen, was der Prozess 16181 tut. Dies kann funktionieren oder auch nicht, je nachdem, wie weit Ihr System entfernt ist.

Wenn es sich bei dem Problem um ein Netzwerkdateisystem handelt, können Sie es möglicherweise zwangsweise aushängen oder online schalten. Wenn das Problem ein Kernel- oder Hardwarefehler ist, hängt das, was Sie tun können, von der Art des Fehlers ab. Ein Neustart (und ein Upgrade auf einen festen Kernel oder das Ersetzen der defekten Hardware) wird dringend empfohlen.


Katze antwortet nie. Ich denke nicht, dass dies ein Fehler ist. Ich denke, es ist ein "Feature".
Eule

7

Die anderen Antworten gehen davon aus, dass es sich um Zombie-Prozesse handelt. Ein Zombie-Prozess ist ein Prozess, der ausgeführt wurde, sich jedoch noch in der Prozesstabelle befindet, falls der Elternteil den Exit-Status wissen möchte. Diese sind normal und initbereinigen automatisch Zombie-Prozesse, die ihr zugewiesen werden.

Zombie-Prozesse sollten niemals dazu führen, dass etwas hängen bleibt. Es scheint also, dass dies nicht Ihr Problem ist. Wenn ein Systemaufruf oder ein Treiber hängen bleibt, befindet sich der Prozess möglicherweise in einem unterbrechungsfreien Zustand. Es gibt eine gute Erklärung hier .


Zu viele Zombie-Prozesse können den forkErfolg verhindern (wenn schwer nrpocerreicht wird), da sie immer noch Platz in der Prozesstabelle belegen.
Dhchdhd

2

So finden Sie Zombie-Prozesse unter Linux:

$ ps axo stat, ppid, pid, comm | grep -w verstorben

Z 555 10242 Damn-Zombie <verstorben>

Zunächst können Sie versuchen, mit dem Befehl kill das SIGCHLD-Signal an den übergeordneten Prozess des Zombies zu senden. Beachten Sie, dass der obige Befehl die PPID (PID des übergeordneten Prozesses) jedes Zombies angibt. In unserem Beispiel ist die PPID des Zombies 555.

$ sudo kill -s SIGCHLD 555

Wenn ein Zombie-Prozess immer noch nicht verschwindet, können Sie den übergeordneten Prozess (z. B. 555) des Zombies beenden.

$ sudo kill -9 555

Sobald der übergeordnete Prozess beendet ist, wird der Zombie vom Init-Prozess übernommen, der allen Prozessen unter Linux übergeordnet ist. Der Init-Prozess ruft regelmäßig wait()auf, um einen Zombie-Prozess zu ernten.


Das ist die wahre Antwort. Das Töten der Eltern hat funktioniert, danke.
Andrew

1

Sie können einen Zombie nur töten, indem Sie seine Eltern töten. Ein Zombie-Prozess hat alle seine Ressourcen freigegeben und wartet darauf, dass sein Exit-Status von seinem Elternteil übernommen wird. Es wird zu einem Zombie, wenn der Elternteil a nicht ausführt wait, um den Exit-Status seines Kindes zu ermitteln. Wenn du die Eltern des Zombies tötest, initerhältst du den Exit-Status und der Zombie stirbt schließlich.


Du willst also, dass ich init töte? Es ist nicht klar aus der Frage sorry hehe, aber der Elternteil scheint init zu sein :( Ich habe die Frage bearbeitet.
Sam Stoelinga

4
Nein, wir möchten, dass Sie nicht versuchen, den Zombie zu töten. Du kannst keinen Zombie töten. Diese FAQ ist so alt wie Unix.
Tripleee

@tripleee: Ja das habe ich verstanden. Vielleicht habe ich keinen Zombie. htop funktioniert nicht und cat / proc / $ pid / cmdline oder ls / proc / $ pid / funktioniert auch nicht. Normalerweise passiert das nicht bei Zombies, deshalb habe ich hier gefragt, das ist imo kein häufiges Problem. Ich habe mehrere Antworten überprüft, die alle Ihnen sagen, dass Sie den Elternteil töten sollen, was in meinem Fall init ist, oder einen Neustart durchführen sollen.
Sam Stoelinga

1
"Kill the parent" ist der Weg, um einen normalen Zombie zu ernten. Du kannst nicht töten init. Wenn ein Zombie repariert wird init, kannst du ihn nicht töten.
Tripleee
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.