Sander, > On 6 Mar 2017, at 15:46, Sander Mak <sander....@luminis.eu> wrote: > > I was trying to get an example to work with the new ProcessHandle API. My > goal was to wait on another process (Spotify) to terminate before printing > something to the console: > > ProcessHandle handle = > ProcessHandle.allProcesses() > .filter(h -> h.info().commandLine().map(cmd -> > cmd.contains("Spotify")).orElse(false)) > .findFirst() > .orElseThrow(() -> new IllegalArgumentException("No matching handle > found")); > > System.out.println(handle.info()); > > ProcessHandle completed = handle.onExit().get(); > System.out.println(completed.isAlive()); > > However this code doesn't wait on `handle` to be terminated, as the JavaDoc > of onExit led me to believe: "Calling onExit().get() waits for the process to > terminate and returns the ProcessHandle.". What I expected: the get() call > blocks until I terminate the Spotify process. Instead, it runs to completion > and prints true for the `isAlive` call in the end. Am I missing something?
This is indeed confusing. ProcessHandle::onExit uses waitpid on “unix”, so is only capable of waiting on child processes. In your code, you use ProcessHandle::allProcesses to retrieve a handle to a non-child process. Running a similar program on Linux, ECHILD can be observed as the error returned from waitpid, which bubbles up as a ‘0’ exit code to onExit. This is a bug. I filed: https://bugs.openjdk.java.net/browse/JDK-8176272 The spec should clarify this behaviour, or ... The implementation could be updated to better handle “waiting” on non-child processes. Possibly polling with `kill(pid, 0)`, or something else. > Env: Java(TM) SE Runtime Environment (build > 9-ea+157-jigsaw-nightly-h6122-20170221) on MacOS. > > Also, first time posting to this list, I hope this is the right avenue for > these questions. This is the correct list for such issues. -Chris.