【问题标题】:Redirect stdout and stderr to file and stderr to stdout将 stdout 和 stderr 重定向到文件,将 stderr 重定向到 stdout
【发布时间】:2014-07-22 23:53:00
【问题描述】:

以下将标准输出写入日志文件并打印标准错误:

bash script.sh >> out.log

这再次将 stdout 和 stderr 写入日志文件:

bash script.sh >> out.log 2>&1

如何结合这两个功能,以便将 stdout 和 stderr 记录到一个文件中,并将 stderr 通过电子邮件发送到我的收件箱?

【问题讨论】:

    标签: linux bash cron


    【解决方案1】:

    您可以将 stdout 保存在单独的文件中,将 stderr 保存在单独的文件中:

    0 * * * * bash script.sh > out.log 2> err.log
    

    然后给自己发电子邮件err.log 文件。

    【讨论】:

      【解决方案2】:

      这是一个可行的解决方案:

      ./myscript.sh &> all.txt 2> stderr.txt
      
      • &> all.txt 同时拥有 stderrstdout
      • 2> stderr.txt 只有stderr

      然后对这些文件做任何你想做的事情,例如电子邮件记录!

      【讨论】:

      • 不幸的是,这不起作用。 Stderr 只会转到 stderr.txt,而不是 all.txt。
      • 你确定吗?当我尝试时它起作用了。除非它是 zsh-only 功能?
      • 啊,我明白了,它确实在 zsh 中工作。在 bash 中它肯定是行不通的。
      【解决方案3】:

      您可以尝试使用进程替换:

      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 模仿邮寄。将其替换为实际发送邮件的命令。

      【讨论】:

        【解决方案4】:
        bash script.sh 2>&1 >> out.log | tee -a out.log
        

        首先,我将 stdout 重定向到文件,将 stderr 重定向到 stdoutstdout 行到达out.log 文件和 stderr 到管道)。

        tee 命令将 stdin 打印到 stdout 和文件(类似于字母 T)。因此,第二,我将原始 stderr 打印到 stdoutout.log 文件(-a 参数表示 追加)。

        【讨论】:

        • 唯一的问题是行可能会重新排序,因为您现在有两个进程输出到同一个文件。不过,我看不出有什么办法。我认为这是最好的答案。
        • @pacholik,谢谢! 2>&1 >> out 得到 stderr 到 | 很有趣(并且违反直觉)而>> out 2>&1 则结束了
        猜你喜欢
        • 1970-01-01
        • 2022-01-18
        • 2012-08-07
        • 1970-01-01
        • 2011-12-28
        • 1970-01-01
        • 1970-01-01
        • 2016-02-19
        • 1970-01-01
        相关资源
        最近更新 更多