我们有一个32位进程A,它必须启动另一个必须在64位进程中运行的java jar。他们通过套接字进行通信。这个系统工作正常。
但在极少数情况下,我们会看到第二个进程(B)挂起,直到我们关闭启动它的进程(A)。当我调试这个问题时,我想读取进程B的输入流以查看正在输出的消息,并且看到从进程B的输入流中读取解决了该问题。所以我们跨越了一个愚蠢的线程,它只读取进程B的输入流,一切正常。
问题非常奇怪,但我们不得不继续前进。我们认为它与控制台输出缓冲区大小或类似的东西有关。但我们已经看到这个问题出现在新安装的机器上,尽管我们读取了启动过程的输入流(B)。
尽管这种情况非常罕见,但我们仍然非常确定为什么会发生这种情况。可能是什么原因?是否有我们不知道的默认设置?你以前遇到过这种情况吗?
快速摘要:
答案 0 :(得分:2)
您需要从生成的进程中同时使用stadout和stderr,并且需要同时执行 ,否则生成的进程可能会阻止等待父进程使用该输出。
更多信息here。
答案 1 :(得分:0)
我有进程挂起问题。对我来说,我想从产生的子进程中获取stdout和stderr日志。由于使用了read blocking call' readLine()'而生成的子进程因挂起而挂起。来自父进程。以下代码对我造成了问题。
BufferedReader processInputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = processInputReader.readLine()) != null){
bw.write(line+"\n"); //write to temp file
}
processInputReader.close();
//get error stream
processInputReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
while ((line = processInputReader.readLine()) != null){
bw.write(line+"\n"); //write to temp file
}
processInputReader.close();
我通过引用https://ostermiller.org/utils/src/ExecHelper.java.html更改了流读取逻辑。现在我不再看到挂起问题了。