如何重定向已經執行的程序的標準輸出/標準錯誤?
(在 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。