我正在尝试在后台运行 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
- shell 将 stderr 重定向到 stdout。
- 然后它调用诺哈普,它继承了这种情况(stderr 和 stdout 使用相同的文件描述符)。
- 诺哈普打开
nohup.out
(文件描述符 3),将其复制到文件描述符 1,然后关闭 3。 - 诺哈普注意到 stderr 不是文件,并且也复制文件描述符 1 到 2。因此文件描述符 1 和 2 都引用
nohup.out
. - 诺哈普
exec
使用命令行上提供的任何参数进行调用(在本例中,富)。新进程继承了文件描述符诺哈普为它设置。
从命令行您无法创建一个案例,正如您所说,nohup 仅重定向 stderr 输出。 诺哈普总是将 stdout 和 stderr 写入文件。stdout 要么转到您通过重定向指定的文件,要么转到nohup.out
;stderr 跟随 stdout,除非您明确将其重定向到另一个文件。
2>&1
使用with的一个特殊方面诺哈普GNU 的版本在 stderr 上产生毫无意义的消息,nohup:忽略输入并将输出附加到“nohup.out”。 (还有什么其他实用程序向标准错误写入一条消息,相当于说,按照文档说明进行操作?) 通常,噪声会写入终端;在重定向下,它最终成为输出文件的第一行。