如何在cronjob输出的行中添加时间戳,并将stdout和stderr重定向到不同的进程和/或文件



我已经花了几个小时来处理这个问题——在cronjobs的输出行中添加时间戳,并将stdout和stderr重定向到单独的进程中,然后重定向到独立的文件中,遇到了几个陷阱。所以,我决定把我的知识作为一个食谱与人们分享。

因此,代码如下,我将进一步解释其特性:

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

正如您所看到的,示例作业jus将一行输出到stderr,另一行输出给stdout,这里没有什么特别之处。

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

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

否则,时间的格式被证明是稳健的和信息丰富的,并转化为以下内容:

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

你可以玩这种格式,并添加亚秒时间分辨率,或者你需要什么。只需记住转义cron中的百分比符号。

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

然后,外括号闭合,输出的剩余部分(只有当dash无法处理命令时才应该存在(将降落到CRONOUT标记下的cron.log或syslog中。不过,我还没有测试过这段话。如果您启用了邮件和/或其他crontab日志记录方式,那么您可能不需要这个。

玩得开心!

最新更新