是否有可用于 cron 作业的扩展日志记录?

是否有可用于 cron 作业的扩展日志记录?

我在 下有 3 个脚本/etc/cron.daily。我的 cron 日志是用/var/log/cron.下面是上面已运行的 cron 的条目。

(root) CMD (run-parts /etc/cron.hourly)

这里cron 内的脚本的stdout或不可用,它表明命令已在该文件夹上运行。stderrrun-parts

有什么技巧可以帮助记录执行 3 个脚本时发生的情况吗?

注意:我无法编辑脚本cron.daily以将输出和错误重定向到日志文件。

答案1

在 Unix 上,邮件系统是将系统通知传递给用户的方式。您可以将其视为有点像在 Windows 上,如果需要通知您某件事,任务栏中会显示一些内容并带有弹出消息。由于 cronjobs(理论上)不应该产生任何输出(因为没有人应该在那里看到它),因此任何输出(stdout 或 stderr)都被视为可能表明错误或问题,因此会向cronjob 的所有者提示他们检查一下。

因此,所有输出(stdout 和 stderr)都通过本地邮件系统发送给 cronjob 的所有者。如果所有者是非个人帐户,您可以通过设置别名指示本地 MTA 中继到真实的电子邮件帐户。例如,我添加到/etc/aliases

root: [email protected]

然后运行newaliases命令(重建邮件别名数据库)。之后,我开始在我的公司电子邮件收件箱中收到 root 的电子邮件:

root@xxxxxxvlp05 ~ $ echo "the game" | mutt root -s "No Diggity"
sendmail: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
sendmail: warning: inet_protocols: configuring for IPv4 support only
postdrop: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
postdrop: warning: inet_protocols: configuring for IPv4 support only

看看它的所有荣耀

这或多或少是正常的方式(让系统发送通知电子邮件)。还有其他处理通知的方法。一些替代方案:

修改别名以将电子邮件保存到特定文件:

root: /var/log/rootMails

将邮件通过管道传输到脚本:

root: |/usr/local/bin/filterMail

解决别名问题的另一种方法是使用MAILTO=许多 cron 守护程序支持的用户 crontab 中的选项。如果您只想接收一组特定的用户通知,而不是任何将放入其邮箱的内容(这就是aliases实现的效果),那么这可能是更好的选择。

我确信还有很多其他的,但您可能想做第一个或最后一个。

答案2

您可以运行 cron 并-s选择使用 syslog 而不是发送邮件。这至少适用于 RHEL 及其衍生产品、FreeBSD 和 MacOS。

答案3

您可以将自己记录在 bash 脚本中:

logfile=/var/log/mine/whatever.log

log () {
    timestamp=$(date +'%F %T')
    echo -e "$timestamp $1" >> $logfile
    shift
    for a; do
        echo -ne "$a" >> $logfile
    done
}    

log "Hello world.\nAnd so on..."

[...]

如果您正在运行具有想要记录的输出的命令:

somecommand 2>&1 >> $logfile

您还可以将消息和错误发送到系统记录器(请参阅 参考资料man logger),并可能通过 syslog 配置对它们进行排序。

相关内容