-
Process API Classes and Interfaces
- ProcessBuilder Class
指定新进程的命令,工作路径,环境变量,指定输入和输出流即stdin
/stdout
/stderr
。 - Process Class
提供操作子进程的方法,比如- 等待子进程结束。
- 获取进程的信息比如是否存活、进程ID、基本信息、退出的状态。
- 获取输入和输出流即
stdin
/stdout
/stderr
。 - 获取子进程启动的子进程,即当前进程的孙进程。
- 杀死子进程。
- ProcessHandle Interface
提供操作进程的方法,比如- 获取当前进程。
- 获取指定进程ID的进程。
- 获取当前进程的父进程。
- 获取当前进程有权限访问的进程的列表。
- 获取进程的信息比如是否存活、进程ID、基本信息、退出的状态。
- 获取子进程启动的子进程,即当前进程的孙进程。
- 杀死子进程。
- ProcessHandle.Info Interface
获取进程的基本信息,比如命令行和参数、启动时间、消耗的CPU时间、用户等。
启动时间,指的是启动时刻,还是从启动时刻到当前的时长,后续实测。
- ProcessBuilder Class
-
Creating a Process
ProcessBuilder
的文档值得阅读。 -
Getting Information About a Process
获取进程的基本信息,比如命令所在路径、启用时间、用户等。 -
Redirecting Output from a Process
使用Runtime.getRuntime()
来启动子进程时,需要手工读取子进程的stdout
和stderr
,否则可能子进程的输出缓冲区满而导致子进程阻塞。
就本问题而言,解决方案是创建两个线程,在线程中读取stdout
和stderr
。 -
Filtering Processes with Streams
ProcessHandle.allProcesses
返回当前进程有权限查看的进程的列表。
考虑到进程的创建、退出均为异步操作,因此列表中的进程,也许不一定处于存活的状态。 -
Handling Processes When They Terminate with the onExit Method
通过Process.onExit
和ProcessHandle.onExit
,可以在进程退出时定义回调函数,当进程退出时,执行一些必要的操作,比如记录日志、进程的退出错误码等。
后续要阅读文档,确认回调触发的时机,在进程即将退出前回调还是在退出之后回调,个人推测,应当是进程退出后触发回调。
ComputableFuture
的文档,值得阅读。thenAccept
thenApply
thenRun
thenApplyAsyc
-
Controlling Access to Sensitive Process Information
对于使用SecurityManager
管理权限的Java应用,赋予运行期权限manageProcess
后,允许:- 查看进程的重要信息,比如用户、用户组、启动路径、参数等。
- 杀掉进程,包括非当前进程创建的进程。
参考资料
- JEP 411
- java runtime.exec() 的讲解
- java runtime exec 输出_Java技巧:使用Runtime.exec重定向本地程序调用
- java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现