我在 Ubuntu 中创建 cron-jobs,方法是将可执行文件放在 之一中/etc/cron.{daily,hourly,monthly,weekly}
。有很多以 cron 开头的目录:
kent@rat:~$ ls -ld /etc/cron*
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.d
drwxr-xr-x 2 root root 4096 2009-07-16 13:17 /etc/cron.daily
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.monthly
-rw-r--r-- 1 root root 724 2009-05-16 23:49 /etc/crontab
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.weekly
我希望在以下情况下从我的脚本中获取电子邮件:
- 脚本失败并给出非零的退出代码。
- 剧本有话要说
我有同步邮件传输协议安装并运行后,我可以从我的 Google 帐户发送邮件。SSMTP 只能使用一个帐户发送邮件,这对我来说不是问题。这只是一个家庭服务器,我的用户无法添加 cron 作业。
我想知道在 Linux/Unix 中以及在 Ubuntu 中,脚本邮件发送通常如何工作。我还想知道在上述两种情况下接收邮件的好方法。
答案1
默认情况下,cron 将向运行 crontab 的帐户的所有者发送电子邮件。
系统范围的 crontab 位于 /etc/crontab 中,以用户“root”身份运行
由于 root 被广泛使用,我建议无论如何都要将 root 别名添加到您的 /etc/aliases 文件。(之后运行“newaliases”)
构造此结构的正常方式是将 root 别名为系统上的另一个用户,例如对我来说,我将“root”别名为“phil”(我的用户帐户),将“phil”别名为我的外部电子邮件地址。
如果您有一个特定的用户 cron,希望在输出时通过电子邮件发送给您,您可以再次使用 /etc/aliases(假设您具有超级用户访问权限)将用户重定向到另一个电子邮件地址,或者您可以在 crontab 顶部使用以下命令:
MAILTO="[email protected]"
如果要将邮件发送给本地用户,您可以只输入用户名:
MAILTO=someuser
如果你需要更多信息,请运行以下命令查看 crontab(5):
man 5 crontab
答案2
为了从 vixie cron 发送电子邮件,您需要一些可以复制 sendmail 命令的东西。因此,安装 postfix 或 SSMTP 将解决这一问题。如果您使用 postfix,则可以使用别名文件将系统用户映射到真实的电子邮件地址。
添加 MAILTO="[电子邮件保护]“添加到 crontab 的顶部将导致来自 cron 作业的任何输出都通过电子邮件发送。无论错误代码如何。
对于将错误正确输出到 STDERR 的脚本,只有当错误发生时才很容易通过电子邮件通知,只需执行以下操作:
MAILTO="[email protected]"
0 5 * * * /bin/some_script > /dev/null
这会将 STDOUT 重定向为空。如果存在任何 STDERR 消息,它们将通过电子邮件发送给您。
但是,我发现有些脚本会错误地将错误输出为 STDOUT,并将退出代码设置为 1。我还没有找到一种方法来从这些脚本中获取输出,但如果退出代码为 0,则忽略输出。我能想到的唯一方法是将输出重定向到文件,然后如果退出代码不是 0,则输出该文件以供 cron 获取。但这似乎很糟糕。
答案3
如果您想将所有输出(stdout 和 stderr)发送到特定地址,则可以使用变量MAILTO
。例如,将以下内容放在脚本顶部。
MAILTO="[email protected]"
答案4
在我的所有生产服务器上,通常每天运行大约 20 个 cronjob,我都信赖 python-cronwrap 包。请在此处查看:http://pypi.python.org/pypi/cronwrap. 它确实很容易配置,而且非常可靠。