2017-11-13 2 views
4

Ein neues Feature von Java 9 ist, dass es nicht nur Prozesse (im Sinne von SIGKILL), die es erstellt hat, zwangsweise beenden kann, sondern es auch unterstützt, eine SIGTERM (in Java als "normale Beendigung" bezeichnet) zu senden.Jede VM, die Process.supportsNormalTermination unterstützt == true?

Gemäß der Dokumentation von Process eine abfragen kann, wenn die Durchführung dieses unterstützt:

public boolean supportsNormalTermination() Gibt true zurück, wenn die Umsetzung destroy() ist normalerweise den Prozess zu beenden, Returns false, wenn die Implementierung von zerstört zwangsweise und sofort den Prozess beendet. Das Aufrufen dieser Methode für Process Objekte, die von ProcessBuilder.start() und Runtime.exec (java.lang.String) zurückgegeben werden, geben True oder False je nach der -Plattformimplementierung zurück.

Ich habe einige Tests mit Oracle JRE 9.0.1 (Windows 64bit):

Process p = Runtime.getRuntime().exec("javaw -cp target/classes TestClassWait10Minutes"); 
p.waitFor(5, TimeUnit.SECONDS); 
System.out.println(p.supportsNormalTermination()); 

aber es scheint, wie Oracle JRE nicht "normale Beendigung" nicht unterstützt, wie ich immer false bekommen.

Da es von der "Plattform-Implementierung" abhängt, scheint es, dass Java 9 es definiert, aber es nicht implementiert.

Weiß jemand, ob die Funktion "normale Beendigung" in irgendeiner verfügbaren Java VM überhaupt verwendbar ist?

+1

Ich beende den Prozess nicht, ich witze nur für 5 Sekunden. Das Java-Programm "TestClass" läuft 10 Minuten. – JMax

Antwort

4

Unter Linux-Implementierung scheint es normale Beendigung zu unterstützen. Von der source of ProcessImpl:

// Linux platforms support a normal (non-forcible) kill signal. 
static final boolean SUPPORTS_NORMAL_TERMINATION = true; 

... 

@Override 

public boolean supportsNormalTermination() { 
    return ProcessImpl.SUPPORTS_NORMAL_TERMINATION; 
} 

nicht der Fall auf Windows.

+0

Offenbar wollte Oracle keine Windows-Implementierung bereitstellen. AFAIK mit 'GenerateConsoleCtrlEvent' ist es möglich, eine Strg + C/SIGTERM über die Konsole an einen Windows-Prozess zu senden. – JMax

+0

@JMax oder vielleicht gibt es einen gültigen Grund. Aber ja, wahrscheinlich wollten sie das nicht. – Kayaman

+1

https://bugs.openjdk.java.net/browse/JDK-8056139 wahrscheinlich adressiert dies, aber ist noch offen. – manouti

Verwandte Themen