我在 下有 3 个脚本/etc/cron.daily
。我的 cron 日志是用/var/log/cron
.下面是上面已运行的 cron 的条目。
(root) CMD (run-parts /etc/cron.hourly)
这里cron 内的脚本的stdout
或不可用,它表明命令已在该文件夹上运行。stderr
run-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 配置对它们进行排序。