2017-11-13 1 views
4

Java 9의 새로운 기능은 작성한 프로세스 (강제로 SIGKILL의 의미로)를 강제로 종료 할 수는 없지만 SIGTERM (Java에서는 "정상 종료"라고 함)을 보내도록 지원할 수도 있다는 것입니다.모든 VM 지원 Process.supportsNormalTermination == true?

구현이 지원하면 조회 할 수 있습니다 Process 하나의 문서에 따르면 : (파괴의 구현) 일반적으로 프로세스를 종료하는 경우

공공 부울 supportsNormalTermination 것은()가 true를 돌려 반환 강제적으로 destroy의 구현 및 가 즉시 프로세스를 종료하면 false입니다. Process플랫폼 구현에 따라 ProcessBuilder.start() 및 Runtime.exec (java.lang.String)에서 반환 한 객체 에서이 메서드를 호출하면 true 또는 false를 반환합니다.

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

그러나 내가 항상 false을 얻을 오라클 JRE는 "정상 종료"를 지원하지 않는 것 같습니다 :

나는 오라클 JRE 9.0.1 (윈도우 64 비트)를 사용하여 몇 가지 테스트를했다.

"플랫폼 구현"에 따라 Java 9가 정의하지만 구현하지는 않습니다.

"정상 종료"기능이 사용 가능한 Java VM에서 전혀 사용할 수 있는지 여부를 아는 사람이 있습니까?

+1

프로세스를 종료하지 않고 5 초 동안 재치 있습니다. Java 프로그램 "TestClass"는 10 분 동 안 실행됩니다. – JMax

답변

4

Linux 구현시 정상 종료를 지원하는 것으로 보입니다. 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; 
} 

하지 Windows의 경우.

+0

오라클은 Windows 구현을 제공하지 않으려 고합니다. 'GenerateConsoleCtrlEvent'를 사용하는 AFAIK은 콘솔을 통해 Windows 프로세스에 Ctrl + C/SIGTERM을 보낼 수 있습니다. – JMax

+0

@JMax 또는 실제로 유효한 이유가있을 수 있습니다. 하지만 네, 아마도 **를 원하지 않았습니다 **. – Kayaman

+1

https://bugs.openjdk.java.net/browse/JDK-8056139가이 문제를 해결했지만 아직 열려 있습니다. – manouti