java - 从已知 PID 重新创建 Java 进程对象
问题描述
我有一个程序(某种进程监视器),它使用 ProcessBuilder 启动多个程序。当我启动这个 ProcessBuilder(对于每个程序)时,我可以启动它,它会给我一个 Process 对象。有了内存中的这个 Process 对象,我什至可以使用 destroy() 或 destroyForcibly() 来停止我的程序。
现在,如果我的主程序(进程监视器)崩溃了,我重新启动它,并且假设我有一个我启动的每个程序的 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()、destroyForcibly() 等)
推荐阅读
- c++ - 在 Linux 上为 Aarch64 (yocto) 交叉编译 OpenCV 无法构建
- apache-camel - shareUnitOfWork 对骆驼的表现有负面影响吗?
- python - 如何在路由的装饰器中捕获错误并使用 JSON 响应进行响应
- react-native - 如何在 React Native 中制作一个包含图标和以省略号结尾的标题的按钮?
- javascript - 如何在 Angular 中忽略 URL 继承
- vue.js - Vuejs Fullcalendar事件未显示
- tensorflow - TypeError:“图像”对象不能使用 PIL 进行下标
- javascript - 单击方法不起作用 - 将 selenium webdriver 与 java 一起使用
- reactjs - 使用 Hooks 将数据从子组件传递到父组件
- ios - 如何更新包含自定义标签的 React Native ScrollView 的 contentSize?