【问题标题】:Launch a process with java and then terminate it使用 java 启动一个进程,然后终止它
【发布时间】:2016-10-17 16:47:04
【问题描述】:

通常我使用这段代码来运行一个 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: 流关闭

我也试过了

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

但是这个过程从未结束,我仍然永远在日志中得到输入。

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

【问题讨论】:

    标签: java processbuilder


    【解决方案1】:

    Process.destroy 可能(并且可能会,但这取决于实现)杀死你的进程,这就是你得到 java.io.IOException 的原因。

    如果您使用的是 Java 8,我建议将 Process.waitFor 与超时构造函数一起使用。您将能够检查您的进程是否已挂起。如果它返回 true,您将使用正常方式捕获流程输出。如果它返回 false,则您的进程可能已挂起,因此您可以终止它,或者再等待一段时间并尝试查看是否有任何变化。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 2016-08-01
      • 2021-09-28
      相关资源
      最近更新 更多