我有 3 个脚本/etc/cron.daily
。我的 cron 日志是用/var/log/cron
. 以下是已运行的上述 cron 的条目。
(root) CMD (run-parts /etc/cron.hourly)
Run Code Online (Sandbox Code Playgroud)
这里cron 中的脚本的stdout
orstderr
不可用,它表明该run-parts
命令已在此文件夹上运行。
是否有任何技巧可以帮助记录执行 3 个脚本时发生的情况?
注意:我无法编辑脚本cron.daily
以将输出和错误重定向到日志文件。
在 Unix 上,邮件系统是将系统通知传递给用户的方式。您可以将其视为有点像在 Windows 上,如果需要通知您某件事,任务栏中会显示一些内容并带有弹出消息。由于 cronjobs(理论上)不应该产生任何输出(因为没有人应该在那里看到它),因此任何输出(stdout 或 stderr)都被视为可能表明错误或问题,因此会向cronjob 的所有者提示他们检查一下。
因此,所有输出(stdout 和 stderr)都通过本地邮件系统发送给 cronjob 的所有者。如果所有者是非个人帐户,您可以通过设置别名指示本地 MTA 中继到真实的电子邮件帐户。例如,我添加到/etc/aliases
:
root: joel.davis@xxx.com
Run Code Online (Sandbox Code Playgroud)
然后运行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
Run Code Online (Sandbox Code Playgroud)
这或多或少是正常的方式(让系统发送通知电子邮件)。还有其他处理通知的方法。一些替代方案:
修改别名以将电子邮件保存到特定文件:
root: /var/log/rootMails
Run Code Online (Sandbox Code Playgroud)
将邮件通过管道传输到脚本:
root: |/usr/local/bin/filterMail
Run Code Online (Sandbox Code Playgroud)
解决别名问题的另一种方法是使用MAILTO=
许多 cron 守护程序支持的用户 crontab 中的选项。如果您只想接收一组特定的用户通知,而不是任何将放入其邮箱的内容(这就是实现的效果aliases
),那么这可能是更好的选择。
我确信还有很多其他的,但您可能想做第一个或最后一个。