代码之家  ›  专栏  ›  技术社区  ›  Maciek Murawski

ProcessHandle onExit具有空数据

  •  6
  • Maciek Murawski  · 技术社区  · 6 年前

    我目前正在测试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();
    

    当我执行这个代码段时,我得到了可选的。终端中为空。 Javadoc声明 info 方法返回任何可用的数据,所以我怀疑JVM无法获取有关派生进程的信息。但当我试图从 ProcessHandle 将来我会得到适当的价值。

    总之,我的问题是:

    有没有办法得到非空的 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中的64个字节。净(xxx.xxx.16.46):icmp\U序列=1 ttl=52时间=6.71毫秒

    waw02s14-in-f14.1e100中的64个字节。净(xxx.xxx.16.46):icmp\U序列=2 ttl=52时间=6.26毫秒

    waw02s14-in-f14.1e100中的64个字节。净(xxx.xxx.16.46):icmp\U序列=3 ttl=52时间=16.6 ms

    waw02s14-in-f14.1e100中的64个字节。净(xxx.xxx.16.46):icmp\U序列=4 ttl=52时间=10.6 ms

    waw02s14-in-f14.1e100中的64个字节。净(xxx.xxx.16.46):icmp\U序列=5 ttl=52时间=13.4毫秒

    ---谷歌。com ping统计信息---

    发送5包,接收5包,0%丢包,时间4007ms rtt最小值/平均值/最大值/mdev=6.267/10.746/16.667/3.968 ms

    更新的用例 :- 我想检查是否可以,给定的命令执行了多长时间,例如通过调用 ProcessHandle.Info::totalCpuDuration

    1 回复  |  直到 6 年前
        1
  •  2
  •   Eugene    6 年前

    我想我找到了这种行为的原因(至少在linux发行版上)。

    ProcessHandle.Info 对象是使用以下方法创建的:

    public static ProcessHandle.Info info(long pid, long startTime) {
        Info info = new Info();
        info.info0(pid);
        if (startTime != info.startTime) {
            info.command = null;
            info.arguments = null;
            info.startTime = -1L;
            info.totalTime = -1L;
            info.user = null;
        }
        return info;
    }
    

    哪里 info.info0(pid) 是对本机方法的调用。 因此,我下载了openjdk源代码并检查了此方法的实现。在linux上,JVM通过读取 /proc/{pid}/stat ,则, /proc/{pid}/cmdline ,则, /proc/{pid}/exe 进程终止后不再可用。

    回答我的问题:

    没有办法得到 ProcessHandle。信息 用于完成的过程。

    推荐文章