Linux:如何将标准输出和标准错误重定向到记录器?


22

我有一个程序需要在启动时运行,它在stdout和stderr上有输出,我想使用logger命令将其重定向到系统日志。我启动脚本中的内容是:

/ home / dirname / application_name -v | logger 2>&1&

这可以将stdout重定向到syslog,但stderr即将进入控制台,因此我需要优化命令。


Answers:


30

您需要先组合STDERR和STDOUT的输出,然后再将其输送到logger。尝试以下方法:

/home/dirname/application_name -v 2>&1 | logger &

$ echo "hi" 2>&1 | logger &
[1] 26818
[1]+  Done                    echo "hi" 2>&1 | logger

$ sudo tail /var/log/messages
Apr 12 17:53:57 greeneggs saml: hi

如果在实际的Bash shell中谨慎使用(也不要与Dash混淆),也可以在这里使用缩写符号:

$ echo "hi" |& logger &

注意:这等效于<cmd1> 2>&1 | <cmd2>。同样,仅当以交互方式使用实际的Bash shell时,才使用上述方法,这将是一种很好的方法。

摘自ABSG

#|&作为2>&1 |的缩写被添加到Bash 4中。

参考文献


2
slm,没有冒犯的意思,但是后一种形式是猖b的Bashism滥用。这种不必要的速记可能引起的问题的数量根本不值得使用它们带来的收益。例如,即使只是在您自己的计算机上,如果将以上内容放入脚本中并dash尝试在启动时执行该脚本,也只会使启动过程失败并破坏启动过程……好吧……当提到这种语法时,总是在的背景下互动炮弹,或者,至少,这就是我的意见。
mikeserv 2014年

@mikeserv-没有犯规8-)。我将它们包括在内,因为它们在ABSG指南中。我假设(可能是错误地)OP一直在使用Bash,因为它们显示了,2>&1但是鉴于示例涉及初创企业,您的警告是非常明智的。我将使后面的这些提示更加突出,并警告它们仅用于交互式Bash shell。
slm

@mikeserv-不,这是合理的建议。我通常不使用Dash甚至不使用Ubuntu,因此我对这些问题有些遗忘,但是它们仍然非常真实,因此指出它们是一件好事,因为Ubuntu / Debian / Dash可能是更常见的情况。
slm

老实说,我也不使用debians,但是我越来越意识到许多人使用了。我确实使用了dash-确实非常快。
mikeserv 2014年

1
好吧,这可能不是必需的-您不能足够快地键入内容以使其在交互式shell中有所作为-为此,我使用zsh。但是,对于脚本来说,破折号比我尝试过的其他任何一种都要快。
mikeserv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.