通常我使用此代码运行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脚本没有终止。它始终处于活动状态,当它检测到某些内容时会打印出来。我想启动脚本,等待一段时间,然后检查它是否检测到了什么。我试图使用p.wait(periode);
我试过这段代码
p.wait(10000);
while((inputRead=stdInput.readLine()) != null){
Helper.log(inputRead);
}
我不确定它是不是我的问题的正确解决方案,但无论如何我得到这个代码的错误
java.lang.IllegalMonitorStateException
我的问题不是关于等待,而是如何在等待之后停止进程并仍然能够获得输出。
答案 0 :(得分:0)
以下是该解决方案的完整示例。一个单独的线程切换主线程的标志以终止,然后输出收集的行:
private static boolean triggerToClose = false;
public static void main(String[] args) throws IOException,
InterruptedException {
ProcessBuilder pb =
new ProcessBuilder("/home/myscript");
Process p = pb.start();
java.io.InputStream is = p.getInputStream();
BufferedReader stdInput = new BufferedReader(new InputStreamReader(is));
String inputRead;
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
}
triggerToClose = true;
}
}).start();
StringBuilder sb = new StringBuilder();
while ((inputRead = stdInput.readLine()) != null) {
if (triggerToClose) {
p.destroy();
break;
}
sb.append(inputRead).append('\n');
}
System.out.println(sb);
}
答案 1 :(得分:0)
在使用.wait(1000)的情况下,完全错误。那个例外也告诉你的是什么
正是您的用例waitFor(long timeout, TimeUnit unit)
:
p.waitFor(10, TimeUnit.SECONDS);