Ernte von Java-Zombie-Prozessen unter OS X 10.7

2299
Mechcozmo

Ich habe CrashPlan auf meinem MacBook Pro ausgeführt, und es ging ein bisschen durcheinander. Im Wesentlichen verursachte es eine Gabelbombe. Zum Glück hatte ich ein offenes Terminalfenster und konnte diesen Befehl ausführen:

sudo launchctl unload /Library/LaunchDaemons/com.crashplan.engine.plist 

Das ständige erneute Laichen hat aufgehört. Aber ich habe immer noch über 900 Java-Prozesse, die nichts anderes tun, als mich gegen meine maximale Prozessanzahl zu drücken. Ich würde es vorziehen, meinen Computer nicht neu zu starten, da ich viele offene Code-Dateien, Webseiten usw. habe. Gibt es eine einfache Möglichkeit, das System zu zwingen, diese Zombies zu ernten? Ich würde den übergeordneten Prozess beenden, aber alle werden von launchd, auch bekannt als PID 1, gestartet. An diesem Punkt wäre es besser, neu zu starten.

Ich habe versucht:

sudo kill -9 <PID> sudo kill -9 java sudo killall -9 java  

Gibt es eine Möglichkeit, die Zombies ein für alle Mal zu töten, ohne dass Sie launchd dafür töten müssen? Oder muss ich neu starten, um diese Zombie-Apokalypse zu überleben?

5

2 Antworten auf die Frage

4
Rich Homolka

Ein Zombie ist schon tot. Denken Sie nicht an einen Prozess, sondern nur an einen Prozessplatz. Es gibt nichts zu töten, also wirkt kill -9 genauso gut wie kill-1, was nichts bedeutet.

Sie warten darauf, dass die Eltern sie ernten. Wenn das Elternteil aus irgendeinem Grund dies nicht tut und der Kernel nicht sagt, dass es sie nicht erzeugen soll, bleiben sie als Zombies übrig.

In traditionellen UNIX ist pid 1 init, was Kinder immer erntet. Ich denke, launchd ist gleich codiert. Wenn Sie Zombies mit PPID als 1 haben, haben Sie zu diesem Zeitpunkt so gut wie keine Optionen mehr als einen Neustart.

2
Mechcozmo

Dies ist leider nicht möglich. Die Zombie-Prozesse sind normalerweise gutartig, da ihre Eltern sie letztendlich ernten und keine Ressourcen verbrauchen. Sie tragen jedoch zur maximalen Prozessanzahl bei, die Ihr System zulässt (ich denke, das hängt von der Menge des im Computer installierten Arbeitsspeichers ab.), aber ich kann keine Dokumentation dafür in Lion finden. Die JVM-Instanzen waren Eigentum von launchd (PID 1 auf dem Mac), und es gibt keine sichere Möglichkeit, launchd zu töten und neu zu starten, ohne dabei alle Kinder von launchd zu töten. Was wäre alles ohne den Kernel.

Dies kann für jeden Runaway LaunchAgent gelten. Die Prozesse wären allesamt Kinder von launchd, und das würde die gleichen Probleme bringen, die ich hatte. Ich glaube nicht, dass jede JVM-Instanz, die mit jedem Stück Java-Code gestartet wird, von launchd erzeugt wird. Es ist jedoch so, dass CrashPlan Java verwendet, und ich hatte diese Probleme mit meinem System.

Ich denke, die Lektion, die hier gelernt werden muss, lautet: Keine Gabel bombardieren und ein Terminalfenster griffbereit halten. Ein Neustart klärte die Zombies auf, also ist alles gut.

"Nein", um "launchd" ohne Neustart sinnvoll zu töten "; Es ist die traurige Wahrheit, AFAICT. ipmcc vor 11 Jahren 0