问题描述
我有一个程序(某种类型的过程监视器),它使用ProcessBuilder启动多个程序。当启动此ProcessBuilder(针对每个程序)时,可以启动它,并且它将给我一个Process对象。有了这个Process对象,我什至可以用destroy()或destroyForcably()停止程序。
现在,如果我的主程序(进程监视器)崩溃了,然后我重新启动了它,并且还说我有我启动的每个程序的PID,那么如何用此PID重新创建Process对象?我没有在Process类或ProcessBuilder中看到该选项(即使我想我们需要一个ProcessLoader而不是Builder)。
有什么办法吗?
为了说明我想要的:
long pid = getPid();
Process process = new Process(pid);
//or
Process process = new Process();
process.load(pid);
解决方法
因此,如果有人需要像我这样的东西,他实际上可以使用ProcessHandle
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ProcessHandle.html
long pid = getPid();
ProcessHandle process;
Optional<ProcessHandle> possibleProcess = ProcessHandle.of(pid);
if(possibleProcess.isPresent()) process = possibleProcess.get();
您将获得一个Stream,可以根据需要进一步收集或操纵它,并且ProcessHandle处理与Process相同的一组操作(onExit(),destroy(),destroyForcably()等)