Io-Redirection
使用 bg 命令後可以像 nohup 一樣重定向輸出嗎?
當我跑
apt-get -y upgrade
我通常會看到這個輸出:
"the following packages will be upgraded..."
我使用
ctrl
+z
並將bg
程序置於後台,但即使我執行其他命令,它的輸出也會出現在 stdout 上。是否可以像這樣將後台程序/命令的輸出重定向到文件
nohup
?
這種方法是不可取的。不使用。如果它破壞了您的系統,您可以保留所有部分。
好的!還在我這兒?對於具有適當包含 (
fcntl
, foropen
) 的簡單情況,將標準重定向到其他地方是(理論上)可能的:#include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(void) { while (1) { printf("blat\n"); sleep(1); } exit(EXIT_SUCCESS); }
編譯並執行:
$ cc -g blat.c -o blat $ ./blat &
現在在其他一些終端中(考慮到調試器可以對實時程序執行的操作,由於各種明顯的原因,這可能會執行違反安全策略)使用為後台作業發布的 PID:
$ gdb -q -p 3727 ... (gdb) call close(1) $1 = 0
看完後
close(2)
我們確定是成功了,標準輸入已經關閉了。讓我們打開一個新文件…(gdb) call open("/home/userrunningblat/blat.out", O_CREAT|O_WRONLY, 0666) No symbol "O_CREAT" in current context.
拍得好。缺少這些符號的幻數是什麼?在第三個終端中,使用我們方便的 compile-and-execute-some-C-program:
$ cfu 'printf("%d\n", O_CREAT|O_WRONLY)' 65
或者您可以深入研究
/usr/include
目錄並自己找出輸入格式和按位 OR,但這非常煩人。(另請注意,這些數字可能而且確實因作業系統而異。)返回gdb
!(gdb) call open("/home/userrunningblat/blat.out", 65, 0666) $2 = 1 (gdb) quit $ tail -f blat.out
這意味著,由於我們之前關閉了標準輸出(
1
),這個open(2)
呼叫已經重用了那個文件描述符號,所以在我們退出gdb
標準輸出之後,現在應該去那個文件。此方法可能不適用於更複雜的程序,可能由於安全限制、缺少調試器資訊、可能導致嚴重損壞等原因而無法使用。