將後台作業的 stdout/stderr 從控制台重定向到記錄檔?

將後台作業的 stdout/stderr 從控制台重定向到記錄檔?

我只是運行一個作業(假設 foo.sh)。

./foo.sh
[Press Ctrl-Z to stop]
bg  # enter background

它產生輸出到 stdout 和 stderr。有沒有什麼方法可以將 stdout 和 stderr 重定向到其他檔案而不是當前畫面?

答案1

顯然我第一次誤讀了你的問題,所以這是我更新的答案:

當你把你的程式送到後台後,你首先要找到它的PID

pgrep foo.sh

然後你可以使用gdb附加到該進程

gdb -p <PID>

然後你gdb改變這個程式寫入的位置

p dup2(open("/path/to/file",577, 420), 1)
p dup2(1, 2)

然後你脫離進程並退出gdb

detach
quit

一點解釋

  • 577相當於O_CREAT|O_WRONLY|O_TRUNC
  • 420相當於S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH
  • 因此,呼叫將open開啟檔案並將其截斷為 0 位元組(如果存在)或建立具有正確檔案權限的新檔案(如果不存在)
  • 第一次呼叫dup2複製了呼叫檔案描述子傳回的檔案描述符open1stdout
  • 第二次呼叫將dup2檔案描述符複製12(即stderr

相關內容