it-swarm.cn

如何在Ubuntu中从(失败的)cron-jobs获取电子邮件?

我通过在/etc/cron.{daily,hourly,monthly,weekly}之一中放置可执行文件来在Ubuntu中创建cron-jobs。有很多以cron开头的目录:

[email protected]:~$ 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

在以下情况下,我想从脚本中获取电子邮件:

  1. 脚本失败,并给出非零的退出代码。
  2. 剧本有话要告诉我

我已经安装 [〜#〜] ssmtp [〜#〜] 并且可以正常工作,我从Google帐户发送邮件。 SSMTP只能使用一个帐户发送邮件这一事实对我来说不是一个问题。它只是一台家庭服务器,我所拥有的用户没有能力添加cron-jobs。

我想知道通常情况下,从脚本发送邮件通常在Linux/Unix和Ubuntu中是如何工作的。我还想知道一种在上述两种情况下获取邮件的好方法。

46
Deleted

默认情况下,cron将通过电子邮件向其运行crontab的帐户的所有者发送电子邮件。

系统级crontab位于/ etc/crontab中,在用户“ root”下运行

因为root被广泛使用,所以我建议还是将根别名添加到/ etc/aliases文件中。 (之后运行“ newaliases”)

构造此文件的正常方法是将root别名给系统上的另一个用户,例如对我而言,我会将'root'别名为'phil'(我的用户帐户),并将别名'phil'别名为我的外部电子邮件地址。

如果您希望在输出时通过电子邮件发送给特定的用户cron,则可以再次使用/ etc/aliases(假设您具有超级用户访问权限)将用户重定向到另一个电子邮件地址,或者可以在crontab的顶部:

MAILTO="[email protected]"

如果邮件应发送给本地用户,则可以只输入用户名:

MAILTO=someuser

如果需要更多信息,请通过运行以下命令查看crontab(5):

man 5 crontab
62
Philip Reynolds

为了获得从vixie cron发送的电子邮件,您将需要复制sendmail命令的内容。因此,安装postfix或SSMTP可以解决此问题。如果使用后缀,则别名文件可用于将系统用户映射到真实的电子邮件地址。

在crontab的顶部添加MAILTO =“ [email protected]”将导致通过电子邮件发送cron作业的任何输出。这与错误代码无关。

对于将错误正确输出到STDERR的脚本,然后仅在错误时将其容易通过电子邮件发送,只需执行以下操作:

MAILTO="[email protected]"
0 5 * * * /bin/some_script > /dev/null

这将仅将STDOUT重定向为null。如果出现任何STDERR消息,他们将收到电子邮件。

但是,我发现一些脚本将错误地将错误输出为STDOUT并将退出代码设置为1。我还没有找到从这些脚本中获取输出的方法,但是如果退出代码为0,则忽略输出。唯一的方法我可以想到的是将输出重定向到文件,然后,如果退出代码不为0,则输出该文件以供cron抓取。虽然看起来很恐怖。

29
Theozaurus

如果要将所有输出(stdout和stderr)发送到特定地址,则可以使用MAILTO变量。例如,将以下内容放在脚本的顶部。

MAILTO="[email protected]"
8
Dan Carley

尝试将“ root:[email protected]”添加到/ etc/aliases

会将有关该用户的所有消息发送到您的电子邮件。如果您不希望收到所有消息,则可以为此专门创建一个用户。

只要脚本输出某些内容,您就会收到一封邮件。

5
Daniel P

在我通常每天大约运行20个cronjobs的所有生产服务器上,我发誓使用python-cronwrap软件包。在此处查看: http://pypi.python.org/pypi/cronwrap 。它真的很容易配置,而且最重要的是可靠。

3
Low Kian Seong

我认为SSMTP不能满足您的需要。您需要可以从cron进程“接收”邮件,然后将其发送到真实邮箱的邮件。

我使用Sendmail,但这是因为我是Sun的老手。我知道这些天所有使用Postfix的好孩子都嘲笑它。您的ubuntu社区可以指导您设置邮件系统。

2
David Mackintosh

另一种选择-我将所有根邮件都存档到某些文件中,然后删除原始邮件。

我录制了一个脚本(这是关键部分)-

#!/bin/bash
if `/usr/bin/mail -e`; then
   /usr/bin/mail --print 2>&1 > /tmp/email_${date +"%Y-%m-%d_%H.%M").log
   echo ‘d *’ | /usr/bin/mail -N > /dev/null
fi
exit 0

这样可以使事情保持整洁,我可以随时注意。我可以通过电子邮件将日常邮件文件发送到外部电子邮件ID,等等。

2
irdroid3