通常我使用此代码运行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秒,然后停止并获取脚本在此期间生成的输出。
答案 0 :(得分:0)
Process.destroy 可能(可能会,但这取决于实现)会杀死你的进程,这就是为什么你得到 java.io.IOException
如果您使用的是Java 8,我建议将Process.waitFor与超时构造函数一起使用。您将能够检查您的流程是否已被挂起。如果它返回 true ,您将使用常规方法捕获过程输出。如果它返回 false ,您的进程可能已挂起,因此您可以终止它,或等待一些,然后尝试查看是否有任何更改。
另一种方法是使用timeout命令控制您的bash脚本,这样您就可以确保您的脚本最终会在有限的时间内终止。