如果 nohup 与终端分离,我如何要求 nohup 不将 stderr 重定向到 stdout?

问题描述 投票:0回答:2

这个问题看起来很幼稚,但我苦苦寻找了半个小时却找不到答案。基本上我不希望 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 中,但该文件是空的。谢谢!

linux stdout stderr nohup
2个回答
1
投票

该错误重定向实际上适用于

gzip
命令,而不是
/.a.out
。您要找的是
./a.out 2> log.txt | gzip -c > result.txt.gz


0
投票

@fireshadow52 已经发布了一个工作解决方案,但我想添加一些细节。

管道将一个进程的

stdout
连接到另一个进程的
stdin
。也就是说,它不会将第一个命令的
stderr
通过管道传输到第二个命令的
stdin
。这意味着,就
nohup
而言,在原始命令中

nohup ./a.out | gzip -c > result.txt.gz 2>log.txt &

stderr
./a.out
仍然连接到终端,因此
nohup
会为您处理重定向,并且
stderr
上的任何输出都会重定向到
nohup.out
。如果
stdout
stderr
仍然输出到终端,那将(可能)干扰共享终端的其他命令的输出。来自
man nohup

如果标准输入是终端,则从不可读的文件重定向它。如果标准输出是终端,则尽可能将输出附加到“nohup.out”,否则附加到“$HOME/nohup.out”。如果标准错误是终端,则将其重定向到标准输出。要将输出保存到文件,请使用“nohup COMMAND > FILE”。

考虑到这一点,很明显你需要重定向

stderr
before 管道并最终得到 @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 &
© www.soinside.com 2019 - 2024. All rights reserved.