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


45

我通过将可执行文件放在之一中在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

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

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

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

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

Answers:


60

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

系统级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

/etc/aliases条目不应该遵循格式 name: value1, value2, ...吗?我不知道,也许格式在过去8年中有所改变。
内森·琼斯

1
“对我来说,我将'root'别名为'phil'(我的用户帐户),并将'phil'别名为我的外部电子邮件地址。” 如何将“ phil”别名为外部电子邮件地址?
霍华德·李

29

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

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

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

MAILTO="foo@bar.com"
0 5 * * * /bin/some_script > /dev/null

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

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



8

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

MAILTO="address@example.com"

5

尝试将“ root:your@email.address”添加到/ etc / aliases

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

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



2

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

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


ssmtp实现了/ bin / sendmail
bobpaul

2

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

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

#!/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,等等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.