Wie kann ich von Java Kind-Prozessen zu befreien, wenn mein Java-Anwendung Ausfahrten / abstürzt?
-
06-07-2019 - |
Frage
Ich starte einen untergeordneten Prozess in Java wie folgt:
final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);
Es läuft jetzt im Hintergrund. Alles ist gut und in Ordnung.
Wenn mein Programm jetzt abstürzt (es ist noch in dev :-)) das Kind Prozess scheint noch herum zu hängen. Wie kann ich es automatisch beendet, wenn der übergeordnete Java-Prozess stirbt?
machenWenn es hilft, ich bin mit Mac OS X 10.5
Lösung
Wie Sie gesagt haben, addShutdownHook ist der Weg zu gehen.
ABER:
-
Es gibt keine wirkliche Garantie, dass Ihr Shutdown-Haken ausgeführt werden, wenn das Programm beendet wird. Jemand könnte den Java-Prozess töten und in diesem Fall Ihre Shutdown-Hook wird nicht ausgeführt. (Wie gesagt in diesem SO Frage )
-
einige der Standardbibliotheken ihre eigenen Haken haben, die vor Ihnen laufen kann.
-
passen sie von Deadlocks.
Eine andere Möglichkeit wäre, Ihr Java-Programm in einem Service wickeln.
Andere Tipps
Ich arbeitete es aus mir schon. Ich füge einen Shutdown-Haken, wie folgt:
final String[] cmd = {"<childProcessName>"};
final Process process = Runtime.getRuntime().exec(cmd);
Runnable runnable = new Runnable() {
public void run() {
process.destroy();
}
};
Runtime.getRuntime().addShutdownHook(new Thread(runnable));