Io-Redirection

使用 bg 命令後可以像 nohup 一樣重定向輸出嗎?

  • March 5, 2017

當我跑

apt-get -y upgrade

我通常會看到這個輸出:

"the following packages will be upgraded..."

我使用ctrl+z並將bg程序置於後台,但即使我執行其他命令,它的輸出也會出現在 stdout 上。

是否可以像這樣將後台程序/命令的輸出重定向到文件nohup

這種方法是不可取的。不使用。如果它破壞了您的系統,您可以保留所有部分。

好的!還在我這兒?對於具有適當包含 ( fcntl, for open) 的簡單情況,將標準重定向到其他地方是(理論上)可能的:

#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標準輸出之後,現在應該去那個文件。

此方法可能不適用於更複雜的程序,可能由於安全限制、缺少調試器資訊、可能導致嚴重損壞等原因而無法使用。

引用自:https://unix.stackexchange.com/questions/348169