Ubuntu

如何重定向已經執行的程序的標準輸出/標準錯誤?

  • October 14, 2014

(在 Ubuntu 10.04 64 位伺服器上執行)

昨天,我犯了一個錯誤,即在不使用 screen 的情況下通過 SSH 啟動一個程序(我沒有意識到這需要幾天時間才能執行)。我今天花了一整天的時間試圖找出一種方法,可以從 SSH 的鐵腕中撬出程序的輸出,以便我可以重新啟動客戶端電腦,但沒有得到任何結果。

我嘗試使用 gdb 並按照本頁底部的說明進行操作,但是當我執行第一個 gdb 命令來創建文件時,我收到一條錯誤消息,指出No symbol table is loaded. Use the "file" command. 根據我收集的內容,這意味著我必須重新編譯其輸出的程序’正在嘗試重定向,這當然對我來說絕對沒有幫助,因為它已經在執行了。

我還認為我可以使用 retty 將輸出重定向到另一個終端,但顯然它不能在 64 位平台上編譯。

如何將此程序的輸出重定向到另一個終端或文件?

看起來這些說明gdb在幾個方面是不正確和不完整的。

首先,你需要使用

gdb [executablefile] [pid]

以便 GDB 知道它實際連接的程序是什麼。我剛剛對此進行了測試,它可以使用剝離的執行檔。請注意,當 gdb 附加到程序時,該程序將被掛起。如果此程序通過網路進行通信,請快速鍵入,否則網路連接可能會超時。

其次,給出的命令沒有解釋它們在做什麼,並且你應該 cd “到你希望你的程序寫入文件的目錄”的指令是錯誤的,因為 gdb 要求原始程序執行該creat()函式. 給出的範例將在正在執行的程序的目前工作目錄中創建 myprog.stderr 和 myprog.stdout 文件,而不是在您執行 gdb 的目錄中。如果您不知道該程序的 CWD 是什麼(或查看ls -l /proc/[pid]/cwd),請在此處使用絕對路徑名。

第三,在沒有解釋的情況下執行,重要的是要知道第一個參數dup2()是前一個返回的文件描述符編號,creat()所以如果這個執行的程序打開了幾個文件,你最終可能會出現類似的交換

(gdb) call creat("/home/me/myprog.stdout",0600)
$1 = 7
(gdb) call dup2(7,1)
$2 = 1
(gdb) call creat("/home/me/myprog.stderr",0600)
$3 = 8
(gdb) call dup2(8,2)
$4 = 2

當您退出 gdb 時,它會詢問您是否要“無論如何都退出(並分離它)”,答案是肯定的。

最後,bg並且disown是 bash 內置函式。如果您沒有使用 bash,那麼您就只能從這裡開始了。 bg將暫停的作業移動到後台,就好像它是使用 在那裡啟動的一樣somecommand &,並disown在 bash 退出時將程序從 bash 的活動程序列表中刪除到 SIGHUP。

引用自:https://serverfault.com/questions/213119