我目前正在测试java 9中的Process API,我对以下代码有一些问题:
Process process = new ProcessBuilder( List.of("ping", "-i", "1", "-c", "4", "google.com")).start();
CompletableFuture<Void> startTimeFuture = process.toHandle().onExit()
.thenApply(ProcessHandle::info)
.thenApply(ProcessHandle.Info::startInstant)
.thenAccept(System.out::println);
startTimeFuture.get();
Run Code Online (Sandbox Code Playgroud)
当我执行这个片段时,我在终端中获得Optional.empty.Javadoc声明该info方法返回任何数据(如果可用),因此我怀疑JVM无法获取有关生成进程的信息.但是当我试图从ProcessHandle未来获得pid时,我得到了适当的价值.
总结一下,我的问题是:
ProcessHandle.Info打电话后有没有办法让非空onExit()?
我正在使用Ubuntu 16.04 LTS
编辑 - 执行时这是终端的输出ping -i 1 -c 5 google.com
PING google.com(xxx.xxx.16.46)56(84)字节的数据.
来自waw02s14-in-f14.1e100.net(xxx.xxx.16.46)的64个字节:icmp_seq = 1 ttl = 52 time = 6.71 ms
来自waw02s14-in-f14.1e100.net(xxx.xxx.16.46)的64个字节:icmp_seq = 2 ttl = 52 time = 6.26 ms
来自waw02s14-in-f14.1e100.net(xxx.xxx.16.46)的64个字节:icmp_seq = 3 ttl = 52 time = 16.6 ms
来自waw02s14-in-f14.1e100.net(xxx.xxx.16.46)的64字节:icmp_seq = 4 ttl …
我试过两个destroy并destroyForcibly使用下面的代码 -
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("current process id:"+currentProcess.getPid());
currentProcess.destroyForcibly();
Run Code Online (Sandbox Code Playgroud)
但在两种情况下都获得例外
线程"main"中的异常java.lang.IllegalStateException:java.base/java.lang.ProcessHandleImpl.destroyForcibly中java.base/java.lang.ProcessHandleImpl.destroyProcess(ProcessHandleImpl.java:308)中不允许销毁当前进程( ProcessHandleImpl.java:331)在util.CurrentProcess.main(CurrentProcess.java:18)
在ProcessHandle简单的"Dockerized"Java程序中尝试使用Java 9中的新API时,我发现在检索正在运行的进程的进程ID时,行为方面存在差异.特别是在调用方法时ProcessHandle.pid(),Docker上生成的PID与主机上显示的本机ID不同,尽管文档说该方法"返回进程的本机进程ID".另外,结果之间存在差异ProcessHandle.allProcesses().
为了演示,以下程序执行以下操作:
public static void main(String[] args) {
System.out.println("### Current process info ###");
ProcessHandle currentProcess = ProcessHandle.current();
printInfo(currentProcess);
System.out.println();
// Fork a child process that lasts for a few seconds
spawnProcess("jshell --startup ./sleep.txt");
printAllVisibleProcesses();
}
private static void printAllVisibleProcesses() {
System.out.println("### Visible processes info ###");
ProcessHandle.allProcesses().forEach(ProcessHandleExamples::printInfo);
System.out.println();
}
private static void spawnProcess(String command) {
System.out.println("Spawning: " + command);
try {
Runtime.getRuntime().exec(command);
} catch (IOException e) {
e.printStackTrace();
} …Run Code Online (Sandbox Code Playgroud)