如何在 Java 9 中使用 JShell 打印 pid、信息、子进程并销毁进程?


JShell 是一个 Java Shell 工具,用于执行类似类、方法、接口、枚举等简单的 java 语句。它会对语句进行评估,然后在命令行提示符中打印结果。

Java 改进了进程 API,以管理和控制操作系统进程。ProcessHandle 接口可识别本地进程并提供对本地进程的控制,提供用于检查进程 存活状态的方法,以及销毁 进程的方法。ProcessHandle.Info 接口提供进程的快照信息。

在下面的代码片段中,我们可以打印Process API.in JShell 工具中的pid信息子进程销毁进程。

代码段

jshell> ProcessHandle currentProcess = ProcessHandle.current();
currentProcess ==> 3960

jshell> System.out.println("Current Process Id: = " + currentProcess.pid());
Current Process Id: = 3960

jshell> currentProcess.info();
$3 ==> [user: Optional[Tutorialspoint\User], cmd: C:\Program Files\Java\jdk-9.0.4\bin\java.exe, startTime: Optional[2020-05-03T06:43:37.510Z], totalTime: Optional[PT1.265625S]]

jshell> currentProcess.pid();
$4 ==> 3960

jshell> ProcessHandle.of(3960)
$5 ==> Optional[3960]

jshell> $5.get()
$6 ==> 3960

jshell> $6.info()
$7 ==> [user: Optional[Tutorialspoint\User], cmd: C:\Program Files\Java\jdk-9.0.4\bin\java.exe, startTime: Optional[2020-05-03T06:43:37.510Z], totalTime: Optional[PT1.390625S]]

jshell> Stream<ProcessHandle> childProc = ProcessHandle.current().children();
childProc ==> java.util.stream.ReferencePipeline$2@6895a785

jshell> childProc.count()
$10 ==> 1

jshell> childProc.forEach(procHandle -> { System.out.println(procHandle.destroy() ? "Could not kill process " + procHandle.pid() : "Terminated " + procHandle.pid()); });

|   java.lang.IllegalStateException thrown: stream has already been operated upon or closed
|      at AbstractPipeline.evaluate (AbstractPipeline.java:229)
|      at ReferencePipeline.forEach (ReferencePipeline.java:430)
|      at (#11:1)

更新于: 2020 年 5 月 3 日

126 次浏览

启动你的 职业生涯

完成课程即可获得认证

开始
广告
© . All rights reserved.