问题描述
我通过将可执行文件放入/etc/cron.{daily,hourly,monthly,weekly}
之一中在Ubuntu中创建cron-jobs。有很多以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
在以下情况下,我想从脚本中获取e-mail:
-
脚本失败并给出非零的退出代码。
-
剧本有话要告诉我
我已经安装了SSMTP并且可以正常工作,我从Google-account发送邮件。 SSMTP只能使用一个帐户发送邮件这一事实对我来说不是一个问题。这只是一台家庭服务器,我没有用户可以添加cron-jobs。
我想知道通常情况下,从脚本发送邮件通常在Linux /Unix和Ubuntu中是如何工作的。我还想知道一种在上述两种情况下获取邮件的好方法。
最佳方法
默认情况下,cron将通过电子邮件向其运行crontab的帐户的所有者发送电子邮件。
system-wide crontab在/etc /crontab中,在用户“ root”下运行
因为root被广泛使用,所以我建议还是将根别名添加到/etc /aliases文件中。 (在之后运行’newaliases’)
构造此文件的正常方法是将root别名给系统上的另一个用户,例如对我来说,我会将’root’别名为’phil'(我的用户帐户),并将别名’phil’别名为我的外部电子邮件地址。
如果您希望在输出时通过电子邮件发送给特定的用户cron,则可以再次使用/etc /aliases(假设您具有超级用户访问权限)将用户重定向到另一个电子邮件地址,或者可以在crontab的顶部:
MAILTO="email@domain.com"
如果邮件应发送给本地用户,则可以只输入用户名:
MAILTO=someuser
如果需要更多信息,请通过运行以下命令查看crontab(5):
man 5 crontab
次佳方法
为了获得从vixie cron发送的电子邮件,您将需要复制sendmail命令的内容。因此,安装postfix或SSMTP可以解决此问题。如果您使用的是后缀,则别名文件可用于将系统用户映射到真实的电子邮件地址。
将MAILTO = “foo@bar.com”添加到crontab的顶部将导致通过电子邮件发送cron作业的任何输出。这与错误代码无关。
对于将错误正确输出到STDERR的脚本,然后仅在错误时将其容易通过电子邮件发送,只需执行以下操作:
MAILTO="foo@bar.com"
0 5 * * * /bin/some_script > /dev/null
这将仅将STDOUT重定向为null。如果有任何STDERR消息,他们将收到一封电子邮件。
但是,我发现有些脚本将错误地将错误输出为STDOUT并将退出代码设置为1。我还没有找到从这些脚本中获取输出的方法,但是如果退出代码为0,则忽略输出。唯一的方法我可以想到的是将输出重定向到文件,然后,如果退出代码不为0,则输出该文件以供cron抓取。虽然看起来很恐怖。
第三种方法
如果要将所有输出(stdout和stderr)发送到特定地址,则可以使用MAILTO
变量。例如,将以下内容放在脚本顶部。
MAILTO="address@example.com"
第四种方法
尝试将“ root:your@email.address”添加到/etc /aliases
会将有关该用户的所有消息发送到您的电子邮件中。如果您不希望收到所有消息,则可以为此专门创建一个用户。
只要脚本输出某些内容,您就会收到一封邮件。
第五种方法
在我通常每天大约运行20个cronjob的所有生产服务器上,我发誓要使用python-cronwrap软件包。在此处检查:http://pypi.python.org/pypi/cronwrap。它真的很容易配置,而且最重要的是可靠。