【发布时间】:2014-07-22 23:53:00
【问题描述】:
以下将标准输出写入日志文件并打印标准错误:
bash script.sh >> out.log
这再次将 stdout 和 stderr 写入日志文件:
bash script.sh >> out.log 2>&1
如何结合这两个功能,以便将 stdout 和 stderr 记录到一个文件中,并将 stderr 通过电子邮件发送到我的收件箱?
【问题讨论】:
以下将标准输出写入日志文件并打印标准错误:
bash script.sh >> out.log
这再次将 stdout 和 stderr 写入日志文件:
bash script.sh >> out.log 2>&1
如何结合这两个功能,以便将 stdout 和 stderr 记录到一个文件中,并将 stderr 通过电子邮件发送到我的收件箱?
【问题讨论】:
您可以将 stdout 保存在单独的文件中,将 stderr 保存在单独的文件中:
0 * * * * bash script.sh > out.log 2> err.log
然后给自己发电子邮件err.log 文件。
【讨论】:
这是一个可行的解决方案:
./myscript.sh &> all.txt 2> stderr.txt
&> all.txt 同时拥有 stderr 和 stdout
2> stderr.txt 只有stderr
然后对这些文件做任何你想做的事情,例如电子邮件记录!
【讨论】:
您可以尝试使用进程替换:
0 * * * * bash script.sh >> out.log 2> >(exec tee >(exec cat >> mail))
或者
0 * * * * bash -c 'exec bash script.sh >> out.log 2> >(exec tee >(exec cat >> mail))'
exec cat >> mail 模仿邮寄。将其替换为实际发送邮件的命令。
【讨论】:
bash script.sh 2>&1 >> out.log | tee -a out.log
首先,我将 stdout 重定向到文件,将 stderr 重定向到 stdout(stdout 行到达out.log 文件和 stderr 到管道)。
tee 命令将 stdin 打印到 stdout 和文件(类似于字母 T)。因此,第二,我将原始 stderr 打印到 stdout 和 out.log 文件(-a 参数表示 追加)。
【讨论】:
2>&1 >> out 得到 stderr 到 | 很有趣(并且违反直觉)而>> out 2>&1 则结束了