将带有日期的 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 的日志文件的主要内容,如果未能解决你的问题,请参考以下文章

linux 从入门到跑路–重定向 管道

如何将 stderr 重定向到文件?

将Java 8 GC日志重定向到stderr

sh 将stderr重定向到stdout

使用系统命令将stdout和stderr输出重定向到文件在perl中不起作用[重复]

sh 将stderr和stdout重定向到文件