Java 21的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時間、用戶等。
啟動時間,指的是啟動時刻,還是從啟動時刻到當前的時長,后續實測。
- 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的文檔,值得閱讀。thenAcceptthenApplythenRunthenApplyAsyc
-
Controlling Access to Sensitive Process Information
對于使用SecurityManager管理權限的Java應用,賦予運行期權限manageProcess后,允許:- 查看進程的重要信息,比如用戶、用戶組、啟動路徑、參數等。
- 殺掉進程,包括非當前進程創建的進程。
參考資料
本文來自博客園,作者:jackieathome,轉載請注明原文鏈接:http://www.rzrgm.cn/jackieathome/p/18412993

浙公網安備 33010602011771號