如果它与终端分离,我如何要求 nohup 不要将 stderr 重定向到 stdout?
How do I ask nohup not to redirect stderr to stdout if it is detached from terminal?
这个问题看起来很幼稚,但经过半小时的密集搜索,我找不到答案。基本上我不希望 stderr 消息潜入我的结果文件。
$nohup ./a.out | gzip -c > result.txt.gz 2>log.txt &
nohup: ignoring input and redirecting stderr to stdout
$zcat result.txt.gz
this is stderr output.
this is stdout output.
a.out 文件由“cc test.c”,
从以下 test.c 编译而来
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
fprintf(stderr, "this is stderr output.\n");
fprintf(stdout, "this is stdout output.\n");
return 0;
}
但我不希望 stderr 消息出现在结果文件中 result.txt.gz。它应该在 log.txt 中,但该文件是空的。谢谢!
错误重定向实际上适用于 gzip
命令,而不是 /.a.out
。您要查找的是 ./a.out 2> log.txt | gzip -c > result.txt.gz
.
@fireshadow52 已经发布了一个可行的解决方案,但我想添加一些细节。
管道将一个进程的 stdout
连接到另一个进程的 stdin
。也就是说,它不会将第一个命令的 stderr
传送到第二个命令的 stdin
。这意味着,就 nohup
而言,在原始命令中
nohup ./a.out | gzip -c > result.txt.gz 2>log.txt &
./a.out
的 stderr
仍然连接到终端,因此 nohup
会为您处理重定向,stderr
上的任何输出都会重定向到 nohup.out
。如果 stdout
或 stderr
仍然输出到终端,那将(可能)干扰共享终端的其他命令的输出。来自 man nohup
:
If standard input is a terminal, redirect it from an unreadable file. If standard output is a terminal, append output to 'nohup.out' if possible, '$HOME/nohup.out' otherwise. If standard error is a terminal, redirect it to standard output. To save output to FILE, use 'nohup COMMAND > FILE'.
考虑到这一点,很明显您需要在 管道之前重定向 stderr
并最终得到 @fireshadow52 的解决方案:
nohup ./a.out 2> log.txt | gzip -c > result.txt.gz &
作为已接受答案的细微变化,也可以使用进程替换而不是管道(尽管我认为后者更具可读性):
nohup ./a.out 2> log.txt > >(gzip -c > result.txt.gz) &
在这种情况下,您希望将 stderr
和 stdout
重定向到不同的目的地,但是如果您希望所有输出都通过管道,只需将 stderr
重定向到 stdout
在管道之前:
nohup ./a.out 2>&1 | gzip -c > result.txt.gz 2>log.txt &
这个问题看起来很幼稚,但经过半小时的密集搜索,我找不到答案。基本上我不希望 stderr 消息潜入我的结果文件。
$nohup ./a.out | gzip -c > result.txt.gz 2>log.txt &
nohup: ignoring input and redirecting stderr to stdout
$zcat result.txt.gz
this is stderr output.
this is stdout output.
a.out 文件由“cc test.c”,
从以下 test.c 编译而来#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
fprintf(stderr, "this is stderr output.\n");
fprintf(stdout, "this is stdout output.\n");
return 0;
}
但我不希望 stderr 消息出现在结果文件中 result.txt.gz。它应该在 log.txt 中,但该文件是空的。谢谢!
错误重定向实际上适用于 gzip
命令,而不是 /.a.out
。您要查找的是 ./a.out 2> log.txt | gzip -c > result.txt.gz
.
@fireshadow52 已经发布了一个可行的解决方案,但我想添加一些细节。
管道将一个进程的 stdout
连接到另一个进程的 stdin
。也就是说,它不会将第一个命令的 stderr
传送到第二个命令的 stdin
。这意味着,就 nohup
而言,在原始命令中
nohup ./a.out | gzip -c > result.txt.gz 2>log.txt &
./a.out
的 stderr
仍然连接到终端,因此 nohup
会为您处理重定向,stderr
上的任何输出都会重定向到 nohup.out
。如果 stdout
或 stderr
仍然输出到终端,那将(可能)干扰共享终端的其他命令的输出。来自 man nohup
:
If standard input is a terminal, redirect it from an unreadable file. If standard output is a terminal, append output to 'nohup.out' if possible, '$HOME/nohup.out' otherwise. If standard error is a terminal, redirect it to standard output. To save output to FILE, use 'nohup COMMAND > FILE'.
考虑到这一点,很明显您需要在 管道之前重定向 stderr
并最终得到 @fireshadow52 的解决方案:
nohup ./a.out 2> log.txt | gzip -c > result.txt.gz &
作为已接受答案的细微变化,也可以使用进程替换而不是管道(尽管我认为后者更具可读性):
nohup ./a.out 2> log.txt > >(gzip -c > result.txt.gz) &
在这种情况下,您希望将 stderr
和 stdout
重定向到不同的目的地,但是如果您希望所有输出都通过管道,只需将 stderr
重定向到 stdout
在管道之前:
nohup ./a.out 2>&1 | gzip -c > result.txt.gz 2>log.txt &