0

プロセスを実行している多くのインスタンスがあります

Runtime rt = Runtime.getRuntime();
int i=0;
int arg1;
while(i<10){
    arg1 = i+1;
    Process p = rt.exec("abc.exe "+ arg1);
    i++;
}

各プロセスは異なる引数値で実行されています。ここでarg1はそのプロセスabc.exeのパラメーターです。これらすべてのプロセスが実行されているか、いずれかがクラッシュしたかどうかを確認したいと思います。クラッシュした場合は、再起動したいのですが。これらすべてのプロセスを追跡し、それらがクラッシュしているかどうかを定期的に確認するにはどうすればよいですか?

LinuxとWindowsでこれを追跡できますか?それに関するいくつかの記事を読んでください、しかしこれはそれが複数の発生を含みそしていくつかの特定のプロセスだけをチェックしなければならないので少し異なります...

4

2 に答える 2

0

このRuntime.exec(...)コマンドはオブジェクトを返しProcessます。Processオブジェクトをコレクションに入れてから、Process.exitValue()メソッドを使用して、各プロセスが終了したかどうかを確認できます。 プロセスがまだ実行中exitValue()の場合はをスローします。IllegalThreadStateException

したがって、コードは次のようになります。

List<Process> processes = new ArrayList<Process>();
// noticed I turned your while loop into a for loop
for (i = 0; i < 10 i++) {
    int arg1 = i + 1;
    Process p = rt.exec("abc.exe "+ arg1);
    processes.add(p);
}
...
// watch them to see if any of them has finished
// this can be done periodically in a thread
for (Process process : processes) {
   try {
       if (process.exitValue() != 0) {
           // it did not exit with a 0 so restart it
           ...
       }
   } catch (IllegalThreadStateException e) {
       // still running so we can ignore the exception
   }
}

LinuxとWindowsでこれを追跡できますか?

質問を理解すれば、上記のコードはLunuxとWindowsで機能するはずです。

于 2012-07-23T18:19:28.663 に答える
0

プロセスビルダーを使用して、起動するプロセスを管理できるプロセスIDを保持します。Runtime.exec(...)実行する必要のある「1回限りの」コマンド用に予約する必要があります。

于 2012-07-23T18:21:27.500 に答える