使用java启动进程然后终止它

时间:2016-10-17 16:47:05

标签: java processbuilder

通常我使用此代码运行bash脚本并获取它的输出

ProcessBuilder pb = new ProcessBuilder("/home/myscript");
Process p = pb.start();
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
String inputRead;
p.waitFor();
while((inputRead=stdInput.readLine()) != null){
    Helper.log(inputRead);
}

这很好但是这次我使用的bash脚本没有终止。它始终处于活动状态,当它检测到某些内容时会打印出来。我想启动脚本,等待一段时间,然后检查它是否检测到了什么。

我试过这段代码

Thread.sleep(5000);
p.destroy();
String inputRead;
while((inputRead=stdInput.readLine()) != null){
    Helper.log(inputRead);
}

但我得到了结果

  

java.io.IOException:Stream closed

我也试过

p.waitFor(5, TimeUnit.SECONDS);
        while((inputRead=stdInput.readLine()) != null){
            Helper.log(inputRead);
        }

但是这个过程永远不会结束,我仍然会在日志中获得输入。

我只想在短时间内运行脚本,在本例中为5秒,然后停止并获取脚本在此期间生成的输出。

1 个答案:

答案 0 :(得分:0)

Process.destroy 可能(可能会,但这取决于实现)会杀死你的进程,这就是为什么你得到 java.io.IOException

如果您使用的是Java 8,我建议将Process.waitFor与超时构造函数一起使用。您将能够检查您的流程是否已被挂起。如果它返回 true ,您将使用常规方法捕获过程输出。如果它返回 false ,您的进程可能已挂起,因此您可以终止它,或等待一些,然后尝试查看是否有任何更改。

另一种方法是使用timeout命令控制您的bash脚本,这样您就可以确保您的脚本最终会在有限的时间内终止。