使用 nohup 将 stdout 重定向到文件不起作用

使用 nohup 将 stdout 重定向到文件不起作用

我正在尝试在后台运行 C 程序。我还想保存程序的标准输出。

但如果我尝试以下操作,nohup 只会将 stderr 输出重定向到 logfile.txt:

nohup ./GetTempValues 11 4 > logfile.txt 2>&1 &

其中 11 和 4 是我需要传递给我的程序的参数,最后一个&是用于在后台运行程序的参数(GetTempValues 是我的程序)。

答案1

您确定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";

PS:在您的示例中,2>&1不需要将 STDERR 重定向到 STDOUT ,因为nohup“如果标准错误是终端,它会被定向到与标准输出相同的位置。”nohup手册页)。

答案2

正如吉多上面指出的那样,诺哈普已经为您重定向了标准错误,除非您将其重定向到文件。如果您使用的是 Linux,那么在 nohup 下运行一个简单的命令并查看dup2(2)之前的调用可能会很有帮助execve(2)

我怀疑你所看到的就是你认为所看到的。让我们想想当你说时会发生什么

nohup foo 2>&1
  1. shell 将 stderr 重定向到 stdout。
  2. 然后它调用诺哈普,它继承了这种情况(stderr 和 stdout 使用相同的文件描述符)。
  3. 诺哈普打开nohup.out(文件描述符 3),将其复制到文件描述符 1,然后关闭 3。
  4. 诺哈普注意到 stderr 不是文件,并且也复制文件描述符 1 到 2。因此文件描述符 1 和 2 都引用nohup.out.
  5. 诺哈普exec使用命令行上提供的任何参数进行调用(在本例中,)。新进程继承了文件描述符诺哈普为它设置。

从命令行您无法创建一个案例,正如您所说,nohup 仅重定向 stderr 输出诺哈普总是将 stdout 和 stderr 写入文件。stdout 要么转到您通过重定向指定的文件,要么转到nohup.out;stderr 跟随 stdout,除非您明确将其重定向到另一个文件。

2>&1使用with的一个特殊方面诺哈普GNU 的版本在 stderr 上产生毫无意义的消息,nohup:忽略输入并将输出附加到“nohup.out”。 (还有什么其他实用程序向标准错误写入一条消息,相当于说,按照文档说明进行操作?) 通常,噪声会写入终端;在重定向下,它最终成为输出文件的第一行。

相关内容