使用java获取正在运行的bash脚本的输出

时间:2016-10-17 14:11:38

标签: 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脚本没有终止。它始终处于活动状态,当它检测到某些内容时会打印出来。我想启动脚本,等待一段时间,然后检查它是否检测到了什么。我试图使用p.wait(periode); 我试过这段代码

p.wait(10000);
while((inputRead=stdInput.readLine()) != null){
    Helper.log(inputRead);
}

我不确定它是不是我的问题的正确解决方案,但无论如何我得到这个代码的错误

java.lang.IllegalMonitorStateException

我的问题不是关于等待,而是如何在等待之后停止进程并仍然能够获得输出。

2 个答案:

答案 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);