我希望从Java开始的进程超时。超时后,我想杀死这个过程。到现在为止还挺好。问题是,我想在正常执行和超时后捕获stderr / stdout。如果我用destroy()杀死进程会怎么样?我可以检索到目前为止生成的(部分)stderr / stdout吗?或者他们走了?
答案 0 :(得分:3)
除了调用stdout
的线程外,您应该有一个或两个单独的线程读取stderr
和Process.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()
完成之前,某些数据仍然可以被写入任一流,但这将会得到 。