防止 cronjob 写入 /var/mail/$USER?

use*_*226 3 osx cron io-redirection email ping

在 macOS 中,配置的 cronjobscrontab将命令输出和/或错误消息(如果 cron 不成功)写入/var/mail/$USER文件。这可以防止吗?我试过了:

* * * * *      /sbin/ping -c1 website.com ... 2>&1 >/dev/null
Run Code Online (Sandbox Code Playgroud)

无论是成功到达域还是失败到达域,都将ping输出保存到邮件文件中...

Kus*_*nda 7

cron 守护程序不会写入/var/mail/$USER,它会在作业输出任何内容或失败时向用户发送电子邮件,然后系统的邮件传递服务将其写入该文件(用户的邮件收件箱)。

要关闭从 cron 守护程序发送电子邮件MAILTO,请在 crontab 文件中将该变量设置为空值:

MAILTO=""

# rest of file with job schedules goes here
Run Code Online (Sandbox Code Playgroud)

来自crontab(5)macOS 系统的手册:

除了LOGNAME, HOME, 和 之外SHELL,cron(8)还将查看MAILTO是否有任何理由发送邮件作为在“这个”crontab 中运行命令的结果。如果 MAILTO已定义(且非空),则将邮件发送给如此命名的用户。如果MAILTO 已定义但为空 ( MAILTO=""),则不会发送邮件。[...]

如果您以这种方式关闭作业输出和错误通知的邮件发送,您可能希望以其他方式记录作业,例如,

* * * * *      /sbin/ping -c1 website.com ... >>/tmp/ping.log 2>&1
0 0,12 * * *   mv /tmp/ping.log /tmp/ping.log.old
Run Code Online (Sandbox Code Playgroud)

这会将 的输出添加ping到特定文件,并在午夜和中午将该文件移走(请注意,您的重定向/dev/null是从后到前的)。

如果ping失败,您可能还想明确发送电子邮件:

* * * * *      /sbin/ping -c1 website.com ... >>/tmp/ping.log 2>&1 || mail -s "ping failed, do something" "$LOGUSER"
Run Code Online (Sandbox Code Playgroud)

每当ping返回非零退出状态时,这将发送带有指定标题的空电子邮件。

或者,您可以从一开始就获得重定向,而不必费心查看MAILTO日志文件或发送电子邮件:

* * * * *      /sbin/ping -c1 website.com ... >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

这将在ping失败时向您发送一封电子邮件,但不会每分钟向您发送命令的输出。