我将 cron 设置为每 15 分钟为用户 pi (在运行 Raspbian Stretch 的 Raspberry Pi 上)运行一个任务。
6,21,36,51 * * * * /usr/bin/mosquitto_sub -h Pi3Plus.local -v -C 1 -t weather >> weather.log
我还设置了 ssmtp 通过 gmail 发送电子邮件。
cron 任务经常无法连接到服务器,并生成错误消息。
问题在于,它随后尝试向用户 pi 发送消息,ssmtp 将其更改为 pi@gmail 并发送到 gmail,但失败。
我已阅读 ssmtp、ssmtp.conf、cron、crontab 的 man,但找不到任何内容来阻止这些消息。
我可以编写一个脚本来捕获 cron 任务中的错误消息,以防止它生成错误。
答案1
来自crontab手册:
除了 LOGNAME、HOME 和 SHELL 之外,cron(8) 还会查看 MAILTO 是否由于在“this”crontab 中运行命令而有任何理由发送邮件。如果定义了 MAILTO(且非空),则邮件将发送给指定的用户。如果定义了 MAILTO 但为空 (MAILTO=""),则不会发送任何邮件。否则邮件将发送给 crontab 的所有者。
只需将变量添加到 crontab 文件的顶部,如本示例所示(取自同一手册页,为清楚起见稍作编辑):
# mail any output to 'paul', no matter whose crontab this is
MAILTO=paul
# run five minutes after midnight, every day
5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
答案2
仅当命令“泄漏”输出到 stdout 或 stderr 时,Cron 才会发送电子邮件。
您可以在 cron 命令行上或脚本本身中将整个脚本包装成带有重定向的块:
{ myMain; } >/dev/null 2>&1 #.. to discard all output.
{ myMain; } >>myCron.log 2>&1 #.. to have somewhere to check fails.
设置 MAILTO="" 适用于所有 cron 作业。重定向允许您获得不同的结果,并将日志与不同的文件关联起来。