启动可执行文件的多个实例并管理它们

时间:2012-07-23 18:15:56

标签: java multithreading exec pid

我有许多正在运行的流程

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上追踪这个东西吗?阅读一些关于它的文章,但这个文章有点不同,因为它涉及多次出现,只能检查一些特定的过程......

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

使用流程构建器,然后保留流程ID,您可以使用该ID来管理您启动的任何流程。 Runtime.exec(...)应保留为您需要执行的“一次性”命令。