Java 21的Process API的笔记

  • Java Core Libraries

  • Process API

  • Process API Classes and Interfaces

    • ProcessBuilder Class
      指定新进程的命令,工作路径,环境变量,指定输入和输出流即stdin/stdout/stderr
    • Process Class
      提供操作子进程的方法,比如
      • 等待子进程结束。
      • 获取进程的信息比如是否存活、进程ID、基本信息、退出的状态。
      • 获取输入和输出流即stdin/stdout/stderr
      • 获取子进程启动的子进程,即当前进程的孙进程。
      • 杀死子进程。
    • ProcessHandle Interface
      提供操作进程的方法,比如
      • 获取当前进程。
      • 获取指定进程ID的进程。
      • 获取当前进程的父进程。
      • 获取当前进程有权限访问的进程的列表。
      • 获取进程的信息比如是否存活、进程ID、基本信息、退出的状态。
      • 获取子进程启动的子进程,即当前进程的孙进程。
      • 杀死子进程。
    • ProcessHandle.Info Interface
      获取进程的基本信息,比如命令行和参数、启动时间、消耗的CPU时间、用户等。
      启动时间,指的是启动时刻,还是从启动时刻到当前的时长,后续实测。
  • Creating a Process
    ProcessBuilder的文档值得阅读。

  • Getting Information About a Process
    获取进程的基本信息,比如命令所在路径、启用时间、用户等。

  • Redirecting Output from a Process
    使用Runtime.getRuntime()来启动子进程时,需要手工读取子进程的stdoutstderr,否则可能子进程的输出缓冲区满而导致子进程阻塞。
    就本问题而言,解决方案是创建两个线程,在线程中读取stdoutstderr

  • Filtering Processes with Streams
    ProcessHandle.allProcesses返回当前进程有权限查看的进程的列表。
    考虑到进程的创建、退出均为异步操作,因此列表中的进程,也许不一定处于存活的状态。

  • Handling Processes When They Terminate with the onExit Method
    通过Process.onExitProcessHandle.onExit,可以在进程退出时定义回调函数,当进程退出时,执行一些必要的操作,比如记录日志、进程的退出错误码等。
    后续要阅读文档,确认回调触发的时机,在进程即将退出前回调还是在退出之后回调,个人推测,应当是进程退出后触发回调。
    ComputableFuture的文档,值得阅读。

    • thenAccept
    • thenApply
    • thenRun
    • thenApplyAsyc
  • Controlling Access to Sensitive Process Information
    对于使用SecurityManager管理权限的Java应用,赋予运行期权限manageProcess后,允许:

    • 查看进程的重要信息,比如用户、用户组、启动路径、参数等。
    • 杀掉进程,包括非当前进程创建的进程。

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小南家的青蛙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值