Background-Process
使用 nohup 將標準輸出重定向到文件不起作用
我正在嘗試在後台執行 C 程序。我還想保存程序的標準輸出。
但如果我嘗試以下操作,nohup 只會將標準錯誤輸出重定向到 logfile.txt:
nohup ./GetTempValues 11 4 > logfile.txt 2>&1 &
其中 11 和 4 是我需要傳遞給我的程序的參數,最後一個
&
是用於在後台執行程序(GetTempValues 是我的程序)。
正如 Guido 上面指出的那樣,nohup已經為您重定向標準錯誤,除非您將其重定向到文件。如果您使用的是 Linux,那麼在 nohup 下執行一個簡單的命令並查看對
dup2(2)
之前的呼叫會很有啟發性execve(2)
。我懷疑你看到的是你認為你看到的。讓我們想想當你說的時候會發生什麼
nohup foo 2>&1
- shell 將標準錯誤重定向到標準輸出。
- 然後它呼叫nohup,它繼承了這種情況(stderr 和 stdout 使用相同的文件描述符)。
- nohup打開
nohup.out
(文件描述符 3),將其複製到文件描述符 1,然後關閉 3。- nohup注意到 stderr 不是文件,並且也將文件描述符 1 複製到 2。因此文件描述符 1 和 2 都指
nohup.out
.- nohup
exec
使用命令行上提供的任何參數(在本例中為foo)呼叫。新程序繼承nohup為其設置 的文件描述符。從命令行您無法創建一個案例,如您所說,nohup 僅重定向 stderr-outputs。 nohup總是將 stdout 和 stderr 寫入文件。stdout 轉到您通過重定向指定的一個,或者轉到
nohup.out
; 除非您明確將其重定向到另一個文件,否則 stderr 會遵循 stdout。
2>&1
與nohup一起使用的一個特殊方面是 GNU 的版本會在 stderr 上生成一條毫無意義的消息nohup:忽略輸入並將輸出附加到 ’nohup.out’。(還有什麼其他實用程序向標準錯誤寫入消息,相當於說,按照說明按照文件行事?)通常,噪音會寫入終端;在重定向下,它作為輸出文件的第一行結束。
您確定會
GetTempValues
產生任何標準輸出嗎?因為您的語法“對我有用”:$ nohup perl test.pl >logfile.txt 2>&1 & [1] 20964 $ cat logfile.txt this goes to stderr this goes to stdout [1]+ Done nohup perl test.pl > logfile.txt 2>&1
test.pl
在哪裡print STDOUT "this goes to stdout\n"; print STDERR "this goes to stderr\n";
2>&1
PS:在您的範例中,不需要將 STDERR 重定向到 STDOUTnohup
,因為*“如果標準錯誤是終端,它會被定向到與標準輸出相同的位置。”* (nohup
手冊頁)。