【问题标题】:Problems killing child process invoked in Java杀死在 Java 中调用的子进程的问题
【发布时间】:2010-10-14 08:06:16
【问题描述】:

在我的程序中,我调用一个 Linux 进程,读取该进程的输出,处理它,然后休眠直到下一次迭代。我遇到的问题是,即使我执行childProcess.destroy(),我调用的进程并不总是会死掉。代码如下:

while(true) {
   Process childProcess = Runtime.getRuntime().exec("./getData");
   InputStream input = childProcess.getInputStream();
   BufferedReader inPipe = new BufferedReader(new InputStreamReader(input));
   while((lineRead = inPipe.readLine()) != null) {
      // do stuff
   }
childProcess.destroy();
inPipe.close();
input.close();
}

在绝大多数情况下,./getData 会运行、优雅地退出,并且我的程序可以正常运行。但是....有时它不会退出,只是坐在那里消耗 CPU。我需要一种杀死它的方法。我也尝试在调用它之前添加它,但这不起作用:

Process killGetData = Runtime.getRuntime().exec("pkill -9 getData");
killGetData.destroy();

我猜我可能陷入了内部 while() 循环。

感谢您收到任何想法、想法和提示。非常感谢提前

约翰

【问题讨论】:

    标签: java process runtime.exec


    【解决方案1】:

    您必须关闭输入管道子进程以终止它。添加

    childProcess.getOutputStream().close();
    

    (它是父进程的输出流,但子进程的输入)。

    [编辑] 另外不要忘记调用childProcess.waitFor() 来清理僵尸进程。

    【讨论】:

    • 嗨亚伦,首先 - 感谢您的回复。你能更详细地解释一下吗?我看过很多我正在尝试做的事情的例子,他们几乎都说同样的话。我将如何使用 getOutputStream?抱歉这个愚蠢的问题,但我对这一切还是很陌生
    • 抱歉,忘记了“.close()” :-) 问题是子进程从标准输入(== 父输出流)读取。当流关闭时它将终止。也不要忘记调用“waitFor()”。如果它已成为“僵尸”进程,这将清理该进程。
    • 再次感谢您的回复亚伦。我会试试看的:)
    • 只有当子进程在其标准输入关闭时终止时才有效;大多数都可以(嗯,您经常希望作为子进程运行的事情),但有些则不会。
    • @Donal:我的观点是:关闭标准输入总是安全,但如果你忘记它,有时会遇到麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多