2012-04-07 5 views
1

Ich habe eine Anwendung geschrieben in Java, die auf Unix läuft und startet zwei Unterprozesse (über Runtime.getRuntime().exec()) beim Start. Wenn die Anwendung aus irgendeinem Grund abgestürzt ist, werden die Unterprozesse nicht gelöscht.Java: Kill alle Subprozesse auf Unix

Jetzt habe ich einen Shutdown Hook hinzugefügt, der bei jedem Absturz ausgelöst wird, ok bis jetzt. Aber ich möchte ein SIGTERM-Signal (oder zumindest SIGINT) auf der UNIX-Konsole für jeden Teilprozess der Anwendung senden. Ich sollte ihre Prozess-IDs über ps finden können, aber ich habe es nicht geschafft, die PID korrekt zu extrahieren und für jeden Prozess ein Signal zu senden.

Kann jemand helfen?

Vielen Dank!

+0

Ich bin mir nicht sicher, aber tun, was Sie wollen in einem Shell-Skript, d. H. Prozess durch Liefern von PID dann im Shell-Skript selbst töten. Rufen Sie dieses Skript in Java auf. – Ved

+0

Wenn Ihre Anwendung einen bestimmten Namen hat, könnte pkill mit diesem Namen arbeiten. – tartar

+0

ein anderer Stub vielleicht hier [1] http://blog.igorminar.com/2007/03/one-more-way-how-to-get-current-pid-in.html – tartar

Antwort

2

Was ich vorschlagen, es ist kein offizielles Feature, aber ein Trick.

So erhalte ich Prozess-ID für meine Java-Anwendungen. Ich habe nie einen anderen Weg gefunden.

public static final String getPid() { 
    try { 
     RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean(); 
     String name = runtimeBean.getName(); 
     int k = name.indexOf('@'); 
     if (k > 0) 
      return name.substring(0, k); 
    } catch (Exception ex) { 
    } 
    return null; 
} 

Dies funktioniert auf Win, Mac und Linux.