例如,我可以这样记录stderr
一个脚本:
* * * * * run_script.sh > /var/log.txt 2>&1
但是我想stderr
在我的crontab中记录所有脚本。我可以附加> /var/log.txt 2>&1
所有脚本,但是如果我有数百个脚本,那是不好的cron
。还有另一种更简单的方法吗?
例如,我可以这样记录stderr
一个脚本:
* * * * * run_script.sh > /var/log.txt 2>&1
但是我想stderr
在我的crontab中记录所有脚本。我可以附加> /var/log.txt 2>&1
所有脚本,但是如果我有数百个脚本,那是不好的cron
。还有另一种更简单的方法吗?
Answers:
在crontab中,可以将MAILTO设置为指向运行脚本的邮件别名。该脚本将接受一封邮件,剥离标题和其他信息,然后使用logger记录其余部分。由于所有cron脚本输出都发送到MAILTO指定的地址,因此您将捕获所有内容。
示例:在crontab中
MAILTO=myalias
在/ etc / mail / aliases中(假设您使用的是sendmail)
myalias:"|/usr/local/bin/my-processing-script.sh"
并删除脚本头中的脚本并处理cron输出。
命令生成的任何输出都会发送到crontab(5)文件中设置的MAILTO环境变量中指定的用户,或者如果未设置MAILTO变量(或者这是at(1)或batch(1)作业) ),交给工作的所有者。如果命令没有输出或MAILTO环境变量设置为空字符串,则不会发送邮件。
由于它使用本地邮件,因此您实际上不需要设置任何内容,或者如果尚未安装mailx,则只需安装。Cron将向您发送输出,您可以将邮件保存在文件中,然后从那里进行很多操作。尝试修改cron的工作方式以直接适合您的需求不是走的路。如果您不这样认为,只需修补并重新构建cron,将其命名为my_cron并使用它代替cron。并且准备最终使您的my_cron保持最新,并经常重新构建它。
在所有脚本的开头添加此内容以记录所有内容并在出现第一个错误时停止
exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e
> /var/log/YOUR_LOG_FILE 2>&1
即,首先将标准输出重定向到文件,然后再将标准错误重定向到标准输出(现在指向文件)。
Ryan Ye在/programming//a/7145618/20774上的脚本对此也很有用,尽管它同时支持stdout和stderr。
我有一个小脚本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