例如,我可以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