2012-01-07 26 views
2

是否可以抓取/攔截已運行的Java程序的輸出?從正在運行的Java程序攔截輸出

這是我的情況:我正在運行一個需要幾個小時才能完成的程序。所以我啓動它,讓計算機執行它的工作。我可以使用SSH登錄運行該程序的計算機,並看到它正在運行ps,但我想攔截寫入控制檯的輸出。

有沒有辦法做到這一點?

我需要提供額外信息嗎?

回答

6

screen會話中啓動應用程序,從會話中分離,然後您可以ssh並重新連接以查看進度。 以下是關於using screen的一些信息。

另一種選擇是將標準輸出和標準錯誤重定向到文件,並使用類似tail的內容來查看其內容。例如:my_program &> /tmp/output

好的,我剛剛意識到我有點偏離主題,因爲我處理的情況下,你必須提前思考。現在,如果tou想從正在運行的進程中獲得它,你可以使用gdb

gdb -p process_id 
(gdb) p close(1) 
$1 = 0 
(gdb) p creat(「/tmp/output″, 0600) 
$2 = 1 
(gdb) q 

這將使輸出/tmp/output,並再次,你可以使用tail看到它交互。

+1

+1提到重定向到文件並使用「尾巴」來查看。 – Perception 2012-01-07 23:36:48

+0

謝謝,這個作品!是否有可能'脫離'新的聽衆?我也想注意你必須這樣做** root **用戶。 – Henridv 2012-01-08 09:15:51

+0

是否可以稍微解釋一下這些gdb命令的作用?我已經找到了這篇文章,但並沒有解釋每條命令:[link](http://blog.tridgell.net/?p=4) – Henridv 2012-01-08 09:31:10

0

是的,你應該捕捉它的標準輸入,輸出和錯誤流。退房$ man popenthis SO question

編輯:對於已經運行的進程,請參閱是否可以將基本調試器附加到進程並按照上述方式複製輸入和輸出流。