标签: processhandle

ProcessHandle onExit具有空数据

我目前正在测试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 …

java java-9 processhandle

6
推荐指数
1
解决办法
218
查看次数

如何使用java 9终止当前进程

我试过两个destroydestroyForcibly使用下面的代码 -

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)

java-9 processhandle

3
推荐指数
1
解决办法
485
查看次数

Docker中的Java 9 ProcessHandle API:PID值和可见进程的差异

ProcessHandle简单的"Dockerized"Java程序中尝试使用Java 9中的新API时,我发现在检索正在运行的进程的进程ID时,行为方面存在差异.特别是在调用方法时ProcessHandle.pid(),Docker上生成的PID与主机上显示的本机ID不同,尽管文档说该方法"返回进程的本机进程ID".另外,结果之间存在差异ProcessHandle.allProcesses().

为了演示,以下程序执行以下操作:

  1. 打印当前进程的PID,
  2. 产生一个睡眠时间为几秒钟的子进程(以便有时间打印其信息),
  3. 最后打印所有可见的进程.

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)

java docker java-9 processhandle

2
推荐指数
1
解决办法
157
查看次数

标签 统计

java-9 ×3

processhandle ×3

java ×2

docker ×1