Frage Was ist ein Prozess und warum wird er nicht getötet?


Der Chrome-Browser reagierte nicht und ich versuchte, es zu töten, aber anstatt zu verschwinden, hatte der Prozess <defunct> zu seiner Rechten, und wurde nicht getötet:

enter image description here

Was ist <defunct> für einen Prozess und warum es nicht getötet wird?


134
2017-10-15 11:27


Ursprung


Die akzeptierte Antwort erwähnt, dass "kill -9 PID funktionieren nicht. "Es ist teilweise wahr: in der Realität wird KEIN Kill funktionieren. Außerdem sollte -9 als letzter Ausweg verwendet werden. In 99% der Fälle wird ein Standard-Kill des Elternprozesses es töten UND alle Kinder ernten Ein "Standard-Kill" ist ein SIGTERM (-15). Ich ermutige Fans des -9 (SIGKILL) zu lesen stackoverflow.com/questions/690415/... - Mike S
stackoverflow.com/questions/356722/... - Aᴍɪʀ


Antworten:


Aus Ihrer Ausgabe wird ein "nicht mehr vorhanden" angezeigt, was bedeutet, dass der Prozess entweder seine Aufgabe abgeschlossen hat oder beschädigt oder getötet wurde, die untergeordneten Prozesse jedoch noch ausgeführt werden oder dieser übergeordnete Prozess seinen untergeordneten Prozess überwacht. Um diese Art von Prozess zu beenden, funktioniert kill -9 PID nicht. Sie können versuchen, sie mit diesem Befehl zu töten, aber es wird dies immer wieder zeigen.

Bestimmen Sie, welcher Elternprozess dieses nicht mehr existierende Prozess ist, und töten Sie ihn. Um dies zu wissen, führe den Befehl aus:

ps -ef | grep defunct

UID          PID     PPID       C    STIME      TTY          TIME              CMD
1000       637      27872      0   Oct12      ?        00:00:04 [chrome] <defunct>
1000      1808      1777       0    Oct04     ?        00:00:00 [zeitgeist-datah] <defunct>

Dann kill -9 637 27872, dann verifiziere, dass der veraltete Prozess vorbei ist ps -ef | grep defunct.


124
2017-10-15 11:47



Sie können den "verstorbenen" Prozess nicht beenden. Sie können das Löschen seines Eintrags in einer Prozesstabelle nur beschleunigen, indem Sie den übergeordneten Eintrag löschen. - jfs
Was ist, wenn das ist? 1 (init) Angenommen, ich muss nur warten? - Luc
Um den Kill zu automatisieren, können Sie dies auch tun (müssen Sie möglicherweise ändern, welche Bytes Sie aus der Ausgabe schneiden): ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9 - warren
@warren Danke. Sie können das auch etwas kürzer und (imo) einfacher machen, indem Sie kein zweites Grep machen. Ändere einfach den ersten Grep nach grep [d]efunct oder ähnlich und es wird nicht zu sich selbst passen. - Thor84no
@warren Sie können einen nicht mehr existierenden Prozess nicht beenden - auch nicht mit einem SIGKILL. Außerdem benutzt du kill -9 ziemlich wahllos. Sehen stackoverflow.com/questions/690415/.... Wenn du verstorbene Kinder töten willst, kannst du versuchen: parents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs kill. Führen Sie das Skript nach etwa 30 Sekunden erneut aus kill -9 wenn du willst. (Beachten Sie, dass ich das Töten von. Ausdrücklich verbiete Init) - Mike S


Handbuchseite ps (1) sagt:

Prozesse markiert <defunct> sind tote Prozesse (sog "Zombies")   das bleibt, weil ihre Eltern sie nicht richtig zerstört haben.   Diese Prozesse werden durch zerstört init(8) wenn der Elternprozess   beendet.

Du kannst es nicht töten, weil es bereits tot ist. Das einzige, was übrig bleibt, ist ein Eintrag in der Prozesstabelle:

Auf Unix- und Unix-ähnlichen Computer-Betriebssystemen, einem Zombie-Prozess oder   nicht existierender Prozess ist ein Prozess, der die Ausführung jedoch noch nicht abgeschlossen hat   hat einen Eintrag in der Prozesstabelle. Dieser Eintrag wird noch benötigt, um zu erlauben   der Elternprozess, um den Beendigungsstatus seines Kindes zu lesen.

Es ist nicht schädlich, solche Prozesse zuzulassen, es sei denn, es gibt viele davon. Zombie wird schließlich von seinen Eltern geerntet (durch Aufruf wait(2)). Wenn das ursprüngliche Elternteil es vor seinem eigenen Ausgang nicht geerntet hat, dann init Prozess (pid == 1) tut es zu einem späteren Zeitpunkt. Zombie-Prozess ist nur:

Ein Prozess, der beendet wurde und der bei seinem Exit-Status gelöscht wird   wurde einem anderen Prozess gemeldet, der auf diesen Prozess wartet   zu beenden.


44
2018-02-27 20:53