我通过将可执行文件放在/etc/cron.{daily,hourly,monthly,weekly}
之一中来创buildUbuntu中的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
我希望在以下情况下从我的脚本中获得电子邮件:
我已经安装并正在运行SSMTP ,我从我的Google帐户发送邮件。 SSMTP只能使用一个帐号发送邮件的事实对我来说不是问题。 这只是一个家庭服务器,我所拥有的用户没有能力添加cron-jobs。
我想知道如何从脚本的邮件通常在Linux / Unix,特别是在Ubuntu的工作。 我也想知道在上述两种情况下,我有一个很好的方式来获得邮件。
默认情况下,cron将通过电子邮件发送运行crontab的帐户的所有者。
系统范围的crontab在/ etc / crontab下运行在用户`root'
因为root被广泛的使用,所以我build议你在/ etc / aliases文件中添加一个根别名。 (之后运行“newaliases”)
构造这个的正常方法是将root用于系统上的另一个用户,例如,对于我来说,我会将“root”别名为“phil”(我的用户帐户),将别名“phil”别名到我的外部电子邮件地址。
如果你有一个特定的用户cron,你想通过电子邮件发送给你,你可以再次使用/ etc / aliases(假设你有超级用户访问权限)将用户redirect到另一个邮件地址,或者你可以在你的crontab的顶部:
MAILTO="[email protected]"
如果邮件应发送给本地用户,则可以只input用户名:
MAILTO=someuser
如果您需要更多的信息,请参阅crontab(5)通过运行:
man 5 crontab
为了从vixie cron发送邮件,你需要一些复制sendmail命令的东西。 所以安装postfix或者SSMTP将把这部分分类。 如果您使用postfix,那么别名文件可以用来将系统用户映射到真实的电子邮件地址。
将MAILTO =“[email protected]”添加到crontab的顶部将导致cron作业的任何输出通过电子邮件发送。 这是无论错误代码。
对于将错误正确输出到STDERR中的脚本,只有当它们出错时才容易得到电子邮件,只需执行以下操作:
MAILTO="[email protected]" 0 5 * * * /bin/some_script > /dev/null
这将只将STDOUTredirect到null。 如果有任何STDERR消息,他们会收到电子邮件给你。
但是,我发现一些脚本会错误地输出错误作为STDOUT并将退出代码设置为1.我还没有find一种方法来抓住这些输出,但如果退出代码为0忽略输出。唯一的方法我可以想到的是将输出redirect到一个文件,然后如果退出代码不是0输出该文件供cron抓取。 看起来很可怕。
如果要将所有输出(stdout和stderr)发送到特定地址,则可以使用MAILTO
variables。 例如,将以下内容放在脚本的顶部。
MAILTO="[email protected]"
尝试添加“root:[email protected]”到/ etc / aliases
那将会把这个用户的所有信息发送到你的邮箱。 如果你不想要所有的消息,你可以创build一个专门为此的用户。
只要脚本输出的东西,你会得到一个邮件。
我不认为SSMTP取决于你需要做什么。 您需要能够从cron进程“接收”邮件的东西,然后将其发送到您的真实邮箱。
我使用Sendmail,但那是因为我是一个老太阳手; 我知道现在所有使用Postfix的酷酷的孩子都会嘲笑它。 你的Ubuntu社区可以指导你设置你的邮件系统。
另一种方法 – 我将所有根邮件归档到某些文件,然后删除原始邮件。
我cron脚本(这里是关键部分) –
#!/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等。
在我每天通常运行约20个cronjob的服务器上,我都会用python-cronwrap软件包发誓。 看看这里: http : //pypi.python.org/pypi/cronwrap 。 configuration非常简单,而且绝大部分都是可靠的。