/etc/cron.daily/foo :向特定用户而不是 root 发送电子邮件?

Ste*_*ski 13 linux cron

我正在运行 CentOS 5.5。

我们有几个 cronjob 存储在 /etc/cron.daily/ 中。我们希望其中一些 cronjob 的电子邮件发送到特定的电子邮件地址,而 /etc/cron.daily/ 中的其余电子邮件应发送到默认电子邮件地址 (root@localhost)。

/etc/cron.daily/ 中的 Cronjobs 从 /etc/crontab 文件运行。/etc/crontab 指定了“邮件”字段。我可以通过在我的 /etc/cron.daily/foo cronjob 中设置 MAILTO 来覆盖它吗?

处理这个问题的最佳方法是什么?

Ste*_*ski 14

设置MAILTO=user@example.org/etc/cron.daily/foo不工作。脚本输出不会发送到 user@example.org 。

http://www.unixgeeks.org/security/newbie/unix/cron-1.html 上的页面也提出了一个简单的解决方案:

该文件/etc/cron.daily/foo现在包含以下内容:

#!/bin/sh
/usr/bin/script 2>&1 | mailx -s "$0" stefanl@example.org
Run Code Online (Sandbox Code Playgroud)

这将向“stefanl@example.org”发送一封电子邮件,其主题等于脚本的完整路径(例如/etc/cron.daily/foo)。

以下是 Unixgeeks.org 对此的评论:

来自 cron 的输出

正如我之前所说,cron 的输出会被邮寄给进程的所有者,或者 MAILTO 变量中指定的人,但如果您不想要怎么办?如果您想将输出通过邮件发送给其他人,您可以将输出通过管道发送到命令邮件。例如

命令行 | mail -s "邮件主题" 用户

有时,我只想从 cronjob 接收错误,而不是 stdout,所以我使用这个技巧。乍一看,语法可能有误,但请放心,它确实有效。下面的 cronjob 会将 STDOUT 发送到 /dev/null,然后将通过管道处理 STDERR。

doit 2>&1 >/dev/null | mailx -s "$0" stefanl@example.org
Run Code Online (Sandbox Code Playgroud)

同样的事情,但发送到系统日志:

doit 2>&1 >/dev/null | /usr/bin/logger -t $ME
Run Code Online (Sandbox Code Playgroud)

另请参阅我在 ServerFault 上对Cronjob stderr 文件和电子邮件的回答


小智 7

更优雅的解决方案是/etc/cron.d直接使用。不要将脚本放在 中/etc/cron.daily,而是将其放在类似的地方/usr/local/sbin/myscript.sh,然后将文件创建/etc/cron.d/myscript为:

MAILTO=root,whomever@example.org
# run myscript.sh at 4:11 every day
11 4 * * * root /usr/local/sbin/myscript.sh
Run Code Online (Sandbox Code Playgroud)

这也使您可以更好地控制工作何时发生;例如仅在某些工作日等。有关crontab(5)更多信息,请参阅该男子。