2010-03-30 33 views
3

我想從Java開始的進程超時。暫停後,我想殺死這個過程。到現在爲止還挺好。問題是,我想在正常執行和超時之後捕獲stderr/stdout。如果我用destroy()殺死進程會發生什麼?我可以檢索到目前爲止產生的(部分)stderr/stdout嗎?或者他們走了?在Java中的Process.destroy()之後,stderr/stdout流會發生什麼變化?

+0

你如何閱讀stdout和stderr?他們怎麼會有「部分」輸出? – 2010-03-30 20:49:31

+0

當進程超時並殺死它時,會有部分結果。然而,我仍然想要捕捉它們以供以後調查。 – 2010-03-30 21:22:12

回答

3

除了調用Process.exec()/waitFor()/destroy()的線程之外,您應該有一個或兩個單獨的線程,分別爲stdoutstderr(如果合併它們,則爲一個)。閱讀線程將獲得生成到EOF的任何數據。如果您致電Process.destroy(),EOF可能會更早發生,就這些。

+0

是的,但是如果我只是殺了進程然後*嘗試收集stderr/stdout會怎麼樣?這是我的問題。 – 2010-03-31 15:27:07

+0

你會以錯誤的順序做事,那就是這個樣子。別。 – EJP 2010-04-01 07:56:56

+2

在多線程,多核心環境中,什麼是「訂單」?因此我的問題。 – 2010-04-01 15:12:52

3

進程處理本質上是特定於操作系統的,我特別關注Java如何在這裏處理Unix進程。

不幸的是,Process closes its streams when you call .destroy()。我不知道爲什麼JDK設計者認爲這是正確的設計模式,但它確實使處理終止的流程變得更加複雜。

值得一提的是,InputStream小號Process認爲是其中居然有一個drainInputStream()方法所做的正是我們會想什麼ProcessPipeInputStream情況 - 它在一個字節的緩衝區後盾文件描述符所有其餘的字節,並將它們存儲讀取爲了我們。此方法「在進程退出時由進程收集器線程調用」,但不幸的是在進程爲'.destroy()編輯時不會調用該方法。

你可以期望的話,最好是陪審團鑽機自己drainInputStream()的行爲,並呼籲,對於這兩種stdoutstderr你打電話之前.destroy()。有些數據仍然可能會在您耗盡它們之後但在.destroy()完成之前寫入到這兩個數據流中,但這會得到大部分

相關問題