在Java中的Process.destroy()之后,stderr / stdout流会发生什么?

时间:2010-03-30 20:46:14

标签: java process

我希望从Java开始的进程超时。超时后,我想杀死这个过程。到现在为止还挺好。问题是,我想在正常执行和超时后捕获stderr / stdout。如果我用destroy()杀死进程会怎么样?我可以检索到目前为止生成的(部分)stderr / stdout吗?或者他们走了?

2 个答案:

答案 0 :(得分:3)

除了调用stdout的线程外,您应该有一个或两个单独的线程读取stderrProcess.exec()/waitFor()/destroy()(如果合并它们,则为一个)。读取线程将获得生成到EOF的任何数据。如果你打电话给Process.destroy(),EOF可能会更早发生,就是全部。

答案 1 :(得分:3)

进程处理本质上是特定于操作系统的,我在这里专门研究Java如何处理Unix进程。

不幸的是Process closes its streams when you call .destroy()。我不知道为什么JDK设计师认为这是正确的设计模式,但它确实使得处理终止的流程变得更加复杂。

值得注意的是,InputStream s Process成立的是ProcessPipeInputStream的实例,其实际上有一个drainInputStream()方法,完全符合我们的要求。 d want - 它读取后备文件描述符中的任何剩余字节,并将它们存储在字节缓冲区中。当进程退出"时,进程收割线程会调用此方法,但遗憾的是,当进程由TERM .destroy()进行调用时,不会调用此方法。

您可以希望的最佳方式是陪审您自己的drainInputStream()行为,并在致电stdout之前为stderr.destroy()调用此行为。在排除它们之后但在.destroy()完成之前,某些数据仍然可以被写入任一流,但这将会得到