2008-11-04 6 views
14

ich starten einen untergeordneten Prozess in Java wie folgt:Wie kann ich Java-Kindprozesse loswerden, wenn meine Java-App beendet wird/abstürzt?

final String[] cmd = {"<childProcessName>"}; 
Process process = Runtime.getRuntime().exec(cmd); 

Es ist nun im Hintergrund ausgeführt wird. Alles gut und gut.

Wenn mein Programm jetzt abstürzt (es ist immer noch in dev :-)) scheint der Kind-Prozess immer noch herumhängen. Wie kann ich es automatisch beenden, wenn der übergeordnete Java-Prozess stirbt?

Wenn es hilft, ich bin mit Mac OS X 10.5

Antwort

10

Wie Sie sagten, 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 beenden und in diesem Fall wird Ihr Shutdown-Hook nicht ausgeführt. (wie in dieser SO question)

  • einige der Standard-Bibliotheken haben ihre eigenen Haken, die möglicherweise vor Ihrem laufen.

  • Vorsicht vor Deadlocks.

Eine andere Möglichkeit wäre wrap your java program in a service.

8

ich es selbst schon ausgearbeitet. 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));