Java 9 ProcessHandle 인터페이스란?
Java 9에서 새롭게 도입된 ProcessHandle 인터페이스는 운영체제의 네이티브 프로세스와 상호작용할 수 있게 해주는 강력한 기능입니다. 이 인터페이스를 활용하면 프로세스 관련 작업을 수행하고 상태를 확인할 수 있으며, 프로세스 ID(pid), 시작 시간, 누적 CPU 사용 시간, 인수(arguments), 명령어(command), 사용자(user), 부모 프로세스, 자식 프로세스(descendants) 등의 정보를 손쉽게 조회할 수 있습니다.
ProcessHandle이 제공하는 주요 기능
- 프로세스에 대한 상세 정보를 담고 있는 ProcessHandle.Info 객체 반환
- 프로세스의 PID 조회
- 프로세스의 실행 생존 여부 확인
- 직계 자식 프로세스의 스냅샷 조회
- 모든 후손(하위) 프로세스의 스냅샷 조회
- 현재 실행 중인 모든 프로세스의 스냅샷 조회
- 프로세스 강제 종료 지원
- 프로세스가 종료되는 시점에 ProcessHandle을 전달받는 CompletableFuture 반환
ProcessHandle.Info가 담고 있는 정보
ProcessHandle.Info는 특정 시점의 프로세스 스냅샷 정보를 저장하며, 다음과 같은 항목들을 포함합니다.
- 프로세스의 명령어(Command)
- 프로세스의 인수(Arguments)
- 프로세스의 전체 명령줄(Command-line)
- 프로세스의 시작 시간
- 프로세스가 사용한 CPU 시간
- 프로세스를 실행한 사용자
ProcessHandle 사용 예제
아래 예제에서는 pid() 메서드를 사용해 현재 프로세스 핸들의 PID를 출력하고, isAlive() 메서드로 해당 프로세스가 현재 실행 중인지 확인하는 방법을 살펴봅니다.
예제 코드
import java.util.Optional;
public class ProcessHandleTest {
public static void main(String args[]) {
long pid = ProcessHandle.current().pid();
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("PID: " + currentProcess.pid());
Optional<ProcessHandle> processHandle = ProcessHandle.of(pid);
boolean isAlive = processHandle.isPresent() && processHandle.get().isAlive();
System.out.println(isAlive);
}
}실행 결과
PID: 6484 true
이처럼 ProcessHandle 인터페이스는 기존의 Process API보다 훨씬 세밀한 프로세스 제어와 모니터링 기능을 제공합니다. 프로세스 상태 추적, 비동기 종료 처리, 하위 프로세스 탐색 등이 필요한 애플리케이션을 개발할 때 매우 유용하게 활용할 수 있습니다.