6

これはかなり単純なはずですが、JavaDocsでは何も役に立ちません。

必要なのは、Javaコードから外部プロセスを実行し、このプロセスがシャットダウンされているかどうかを監視できるようにすることです。つまり、外部プロセスがユーザーによって終了されていないかどうかを確実に判断できるようにしたいのです。

クロスプラットフォームソリューションが存在しない場合は、Linuxで動作するものをすべて受け入れます。

私の現在のコードスニペット:

public static void main(String[] args) {
    ProcessBuilder pb = new ProcessBuilder("some proces name");

    try {
        Process p = pb.start();
        // p.isRunning(); <- now, that would be helpful :-)
    } catch (IOException e) {
        e.printStackTrace();
    }
}
4

3 に答える 3

7

Process.waitFor()呼び出しを開始し、その呼び出しが戻ったときにフラグを設定する新しいスレッドを開始します。その後、プロセスが完了したかどうかを確認したいときはいつでも、そのフラグをチェックできます。

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;
  }
}

(一部の定型文は省略)。

于 2012-07-16T18:50:35.377 に答える
5

質問を理解しているかどうかはわかりませんが、これを行う1つの方法は、を呼び出すことprocess.exitValue();です。プロセスがまだ終了していない場合は、例外がスローされます。

/**
 * 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();

ハックを気にしない場合、クラスを使用する〜Unixシステムで作業している場合は、次のようなことを行うことができますUNIXProcess。ただし、これはリフレクションを使用します。

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)) {
    ...
}
于 2012-07-16T18:40:25.587 に答える
2

質問の特定のコードスニペットに基づいて、1.8以降、ProcessクラスにisAlive()メソッドが使用可能であることを追加すると便利な場合があります

ドキュメントリンク:https ://docs.oracle.com/javase/8/docs/api/java/lang/Process.html

これを読んでいる人に頑張ってください!

于 2017-07-12T17:49:06.107 に答える