How to monitor external process ran by ProcessBuilder?

前端 未结 3 1728
眼角桃花
眼角桃花 2020-12-19 08:47

This should be rather simple, but I don\'t see anything helpful in JavaDocs.

What I need is to run some external process from my Java code and then be able to monito

相关标签:
3条回答
  • 2020-12-19 09:04

    Based on the question's specific code snippet I might be useful to add that since 1.8 the Process class has an isAlive() method is available

    Documentation link: https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html

    good luck to anyone reading this!

    0 讨论(0)
  • 2020-12-19 09:10

    I'm not sure I'm understanding the question but one way to do this is to call process.exitValue();. It throws an exception if process has not yet terminated:

    /**
     * Returns the exit value for the subprocess.
     *
     * @return  the exit value of the subprocess represented by this 
     *          <code>Process</code> object. by convention, the value 
     *          <code>0</code> indicates normal termination.
     * @exception  IllegalThreadStateException  if the subprocess represented 
     *             by this <code>Process</code> object has not yet terminated.
     */
    abstract public int exitValue();
    

    If you don't mind a hack, you can do something like the following if you are working on a ~Unix system which uses the UNIXProcess class. This does use reflection however:

    ProcessBuilder pb = new ProcessBuilder("/bin/sleep", "5");
    Process process = pb.start();
    // open accessability of the UNIXProcess.hasExited field using reflection
    Field field = process.getClass().getDeclaredField("hasExited");
    field.setAccessible(true);
    // now we can get the field using reflection
    while (!(Boolean) field.get(process)) {
        ...
    }
    
    0 讨论(0)
  • 2020-12-19 09:15

    Start a new Thread which calls Process.waitFor() and sets a flag when that call returns. then, you can check that flag whenever you want to see if the process has completed.

    public class ProcMon implements Runnable {
    
      private final Process _proc;
      private volatile boolean _complete;
    
      public boolean isComplete() { return _complete; }
    
      public void run() {
        _proc.waitFor();
        _complete = true;
      }
    
      public static ProcMon create(Process proc) {
        ProcMon procMon = new ProcMon(proc);
        Thread t = new Thread(procMon);
        t.start();
        return procMon;
      }
    }
    

    (some boilerplate omitted).

    0 讨论(0)
提交回复
热议问题