java - 杀死在 Java 中调用的子进程的问题

标签 java process runtime.exec

在我的程序中,我调用一个 Linux 进程,读取该进程的输出,对其进行处理,然后 hibernate 直到下一次迭代。我遇到的问题是我调用的进程并不总是终止,即使当我执行 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() 循环。

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

约翰

最佳答案

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

childProcess.getOutputStream().close();

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

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

关于java - 杀死在 Java 中调用的子进程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3931231/

相关文章:

java - ProcessBuilder 和 Runtime.exec() 的区别

java - 如何控制 Wicket 表单中的提交 url 操作?

java - 继承实体类的通用回调方法(@PostLoad..) - JPA EclipseLink

java - 提取 .jpg 元数据/metadata-extractor/exif/java

java - 在 Eclipse 中隐藏重复的工具栏项目

python - Qt:QPushButton 被子进程阻塞

java - 带有java的linux ulimit不能正常工作

linux - 获取子进程列表,在 Linux 中由父进程运行

java - 在 Windows 机器上监控 (java) 进程死亡的最佳方法是什么?

java - 使用运行时从 Java 运行 smbclient 命令