将带有日期的 stderr 重定向到来自 Cron 的日志文件
Posted
技术标签:
【中文标题】将带有日期的 stderr 重定向到来自 Cron 的日志文件【英文标题】:Redirect stderr with date to log file from Cron 【发布时间】:2011-11-01 00:18:02 【问题描述】:一个 bash 脚本从 cron 运行,stderr 被重定向到一个日志文件,这一切都很好。 代码是:
*/10 5-22 * * * /opt/scripts/sql_fetch 2>> /opt/scripts/logfile.txt
我想在日志文件的每一行前面加上日期,这不起作用,代码是:
*/10 5-22 * * * /opt/scripts/sql_fetch 2>> ( /opt/scripts/predate.sh >> /opt/scripts/logfile.txt )
predate.sh 脚本如下所示:
#!/bin/bash
while read line ; do
echo "$(date): $line"
done
所以第二段代码不起作用,有人能解释一下吗? 谢谢。
【问题讨论】:
仅供阅读,仅供参考,我的系统上的 cron 存在问题,这就是为什么我没有得到结果,上面的代码确实有效,但是 Ryan 直接在下面发布了解决方案好多了。 【参考方案1】:我有一个小脚本 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
【讨论】:
这很好,但看起来它会为每一行打印相同的时间戳,即使您的脚本输出文本行几分钟。您可以尝试将输出传送到ts
,而不是sed
,并且每行应该有不同的时间戳。 ts
来自 moreutils 包,请参阅此相关问题:***.com/questions/21564/…【参考方案2】:
*/10 5-22 * * * (/opt/scripts/predate.sh; /opt/scripts/sql_fetch 2>&1) >> /opt/scripts/logfile.txt
应该完全是你的方式。
【讨论】:
以上是关于将带有日期的 stderr 重定向到来自 Cron 的日志文件的主要内容,如果未能解决你的问题,请参考以下文章