Java 9는 Process 클래스에 새로운 메소드들을 추가하여 기능을 크게 개선했습니다. 또한 프로세스와 관련된 모든 세부 정보를 손쉽게 조회할 수 있도록 ProcessHandle 인터페이스와 ProcessHandle.Info 인터페이스를 새롭게 제공합니다.
Java 9에서 Process 클래스에 추가된 새로운 메소드
- boolean supportsNormalTermination(): destroy() 메소드의 구현이 프로세스를 정상적으로 종료하는 방식이라면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
- long pid(): 운영체제 수준의 네이티브 프로세스 ID(PID)를 반환합니다.
- ProcessHandle toHandle(): 해당 Process 객체에 대한 ProcessHandle을 반환합니다.
- Stream<ProcessHandle> children(): 프로세스의 직계 자식 프로세스들에 대한 스냅샷을 반환합니다.
- Stream<ProcessHandle> descendants(): 프로세스의 모든 후손(자식의 자식까지 포함) 프로세스들에 대한 스냅샷을 반환합니다.
- ProcessHandle.Info info(): 프로세스에 대한 정보(명령어, 시작 시간, 사용자 등)의 스냅샷을 반환합니다.
- CompletableFuture<Process> onExit(): 프로세스가 종료될 때 완료되는 CompletableFuture를 반환하므로, 비동기 방식으로 종료 이벤트를 처리할 수 있습니다.
예제 코드
아래 예제는 현재 실행 중인 프로세스의 핸들을 가져오고, ProcessHandle.Info를 통해 다양한 프로세스 정보를 확인하는 방법을 보여줍니다.
public class ProcessTest {
public static void main(String args[]) {
ProcessHandle processHandle = ProcessHandle.current();
ProcessHandle.Info processInfo = processHandle.info();
System.out.println(processHandle.pid());
System.out.println(processHandle.parent());
System.out.println(processInfo.arguments().isPresent());
System.out.println(processInfo.command().isPresent());
System.out.println(processInfo.command().get().contains("tutorialspoint"));
System.out.println(processInfo.startInstant().isPresent());
}
}실행 결과
4892 Optional[7788] false true false true
결과 해석
- 4892: 현재 프로세스의 PID입니다.
- Optional[7788]: 부모 프로세스의 PID가 Optional로 감싸져 반환됩니다.
- false: 명령행 인수(arguments) 정보가 존재하지 않습니다.
- true: 실행 명령어(command) 정보가 존재합니다.
- false: 명령어 문자열에 "tutorialspoint"가 포함되어 있지 않습니다.
- true: 프로세스 시작 시간(startInstant) 정보가 존재합니다.
이처럼 Java 9의 Process API 개선 사항을 활용하면 운영체제에 종속적인 코드 없이도 프로세스 ID 조회, 자식 프로세스 탐색, 종료 알림 처리 등을 표준화된 방식으로 수행할 수 있습니다.