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后,允许:

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

参考资料

posted @ 2024-09-13 22:17  jackieathome  阅读(32)  评论(0编辑  收藏  举报