Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
终止Java中调用的子进程时出现的问题_Java_Process_Runtime.exec - Fatal编程技术网

终止Java中调用的子进程时出现的问题

终止Java中调用的子进程时出现的问题,java,process,runtime.exec,Java,Process,Runtime.exec,在我的程序中,我调用一个Linux进程,读取该进程的输出,处理它,然后休眠到下一次迭代。我遇到的问题是,我调用的进程并不总是死的,即使我执行childProcess.destroy()。代码如下: while(true) { Process childProcess = Runtime.getRuntime().exec("./getData"); InputStream input = childProcess.getInputStream(); BufferedReader

在我的程序中,我调用一个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()的内部循环

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


John

必须关闭子进程的输入管道才能终止它。加

childProcess.getOutputStream().close();
(它是父进程的输出流,但子进程的输入)


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

首先,你好,亚伦-谢谢你的回复。你能详细解释一下吗?我看过很多我想做的例子,它们都说了同样的话。如何使用getOutputStream?很抱歉问了这个愚蠢的问题,但我对这一切还是很陌生。对不起,忘记了“.close()”:-)问题是子进程从stdin(=父进程的输出流)读取数据。它将在流关闭时终止。另外,不要忘记调用“waitFor()”。这将清理进程,如果它已成为一个“僵尸”进程。再次感谢您的回复。我将试一试:)这只在子进程在其stdin关闭时终止时有效;大多数都可以(当然,您经常希望作为子流程运行的事情)但有些不能。@Donal:我的观点是:关闭stdin总是安全的,但如果您忘记了它,有时您会遇到麻烦。