【问题标题】:How to add timestamps to lines of a cronjob output and redirect stdout and stderr to different processes and/or files如何将时间戳添加到 cronjob 输出的行并将 stdout 和 stderr 重定向到不同的进程和/或文件
【发布时间】:2022-01-08 23:40:03
【问题描述】:

我已经为此花费了几个小时 - 将时间戳添加到 cronjobs 的输出行并将 stdout 和 stderr 重定向到单独的进程,然后再到单独的文件,偶然发现了几个陷阱。所以,我决定与外面的人分享我的知识,作为食谱。

【问题讨论】:

    标签: bash cron sh


    【解决方案1】:

    所以,代码如下,我将进一步解释特殊性:

    crontab sample

    MAILTO=""
    
    * * * * * ((/home/ilya/stdoutanderr.sh | ts "\%FT\%T\%z:" >> /srv/data/log/ilya-test-crontab-ts/stdout.log) 2>&1 | ts "\%FT\%T\%z:" >> /srv/data/log/ilya-test-crontab-ts/ts-stderr.log) 2>&1 | logger -t CRONOUT
    

    使用 crontab -e 编辑您的 crontab。

    首先,MAILTO="" 行用于禁止发送 cron 输出。如果您不阅读这些邮件 - 最好将其隐藏。

    然后您会看到 cronjob 的示例,其中 stdoutanderr.sh 是 cronjob 本身,其余部分用于时间戳、分别记录 stderr 和 stdout 并将命令本身的任何错误输出到 syslog。

    stdoutanderr.sh

    #!/bin/bash
    echo "Sample stdout at " $(date)
    echo "Sample stderr at " $(date) >&2
    

    如您所见,示例作业只是将一行输出到 stderr,另一行输出到 stdout,这里没什么特别的。

    ts 是来自moreutils 包的实用程序,您应该安装它以使用这种方法(或者您可以将其模拟为一个函数 - 网络中有示例),作业的标准输出通过管道传输到然后附加到指定的文件中。所有这些都发生在括号中,所以在括号的输出中我们只有标准错误。

    这是我不知道的第一个棘手部分 - 必须另外在 cronjob 命令行中转义 % 符号,否则该行的其余部分将变成命令的输入,所以充其量它不会t 按预期运行。如您所见 - ts 格式中的 % 符号前面有一个反斜杠。

    否则,时间的格式被证明是健壮且信息丰富的,并变成以下:

    2021-12-02T12:25:01+0000: Sample stdout at  Thu Dec 2 12:25:01 UTC 2021
    

    您可以使用该格式并添加亚秒级时间分辨率,或者您需要的任何东西。请记住在 cron 中转义百分比符号。

    然后为了方便起见,我们将 stderr 重定向到 stdout 以将其通过管道传递到另一个 ts 调用并附加到另一个文件。这是通过重定向2>&1 实现的。但请注意,crontab 使用 dash 而不是 bash 运行,|& 无法按预期工作,因此请使用长重定向。

    然后外括号被关闭,剩下的输出(只有在破折号无法处理命令时才应该存在)将登陆到CRONOUT标签下的cron.log或syslog。不过,还没有测试过这一段。如果您启用了邮件和/或其他方式的 crontab 日志记录 - 您可能不需要这个。

    玩得开心!

    【讨论】:

      猜你喜欢
      • 2014-07-22
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 2011-12-15
      相关资源
      最近更新 更多