将 crontab 的所有 stderr 输出记录到文件中

将 crontab 的所有 stderr 输出记录到文件中

例如,我可以stderr通过以下方式记录一个脚本:

* * * * * run_script.sh > /var/log.txt 2>&1

但我想stderr在我的 crontab 中记录所有脚本。我可以附加> /var/log.txt 2>&1到所有脚本,但是如果我有数百个脚本,那就不好了cron。还有另一种更简单的方法吗?

答案1

在 crontab 中,您可以将 MAILTO 设置为指向运行脚本的邮件别名。该脚本将接受邮件消息,去掉标题和其他内容,并使用记录器记录其余部分。由于所有 cron 脚本输出都发送到 MAILTO 指定的地址,因此您可以捕获所有内容。

示例:在 crontab 中

MAILTO=myalias

在 /etc/mail/aliases 中(假设您使用的是 sendmail)

myalias:"|/usr/local/bin/my-processing-script.sh"

并让脚本去掉邮件标头并处理 cron 输出。

答案2

命令生成的任何输出都会发送到 crontab(5) 文件中设置的 MAILTO 环境变量中指定的用户,或者如果未设置 MAILTO 变量(或者如果这是 at(1) 或 batch(1) 作业),给作业的所有者。如果命令不产生输出或者 MAILTO 环境变量设置为空字符串,则不会发送任何邮件。

由于它使用本地邮件,因此您实际上不需要设置任何内容,或者如果尚未安装 mailx,则只需安装 mailx 即可。 Cron 将向您发送输出,您可以将邮件保存在文件中并从那里执行许多操作。尝试修改 cron 的工作方式来直接满足您的需要并不是正确的方法。如果您不这么认为,只需修补并重新构建 cron,将其命名为 my_cron 并使用它来代替 cron。并准备好最终使您的 my_cron 保持最新并经常重新构建它。

将其添加到所有脚本的开头以记录所有内容并在第一个错误处停止

exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e

答案3

Ryan Ye 的剧本结束于https://stackoverflow.com/a/7145618/20774对此也很有用,尽管它同时执行标准输出和标准错误。


我有一个小脚本 cronlog.sh 来执行此操作。脚本代码

#!/bin/sh
echo "[`date`] Start executing $1"
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/"
echo "[`date`] End executing $1"

那么你可以做

cronlog.sh /opt/scripts/sql_fetch >> your_log_file

结果示例

cronlog.sh echo 'hello world!'

[Mon Aug 22 04:46:03 CDT 2011] Start executing echo
[Mon Aug 22 04:46:03 CDT 2011] helloworld!
[Mon Aug 22 04:46:03 CDT 2011] End executing echo

相关内容