今天我设置了 ssmtp 以便从 sendmail 给我发送电子邮件。然而我没想到的是,像 cron 这样的应用程序也会给我发送电子邮件。
在备份数据库之前,我的一个 cron 脚本尝试创建路径/年份/月份/,由于年份和月份已经存在,因此我收到了电子邮件
From: Root
Subject: Cron <root@myserver> /path/scripts/mysqlbackup.sh
mkdir: cannot create directory `2010': File exists
mkdir: cannot create directory `09': File exists
我该如何让它停止?它只运行了一个小时,所以如果这是唯一的错误,我只需修复脚本即可。
答案1
默认情况下,cron 会通过电子邮件向您发送 cronjob 的输出消息。更具体地说,它会保存 cronjob 的 stdout(标准输出)和 stderr(标准错误输出),并通过电子邮件将其发送给 crontab 的所有者或 crontab 中 MAILTO 变量中指定的用户。
为了防止输出到达您,您必须确保 stdout 和 stderr 未被保存,而是写入文件或 /dev/null。
您可以通过在作业定义中使用类似这样的内容来实现这一点:
job.sh > /dev/null 2>&1
这会将 stdout 重定向到 /dev/null(“> /dev/null”部分),并将 stderr 重定向到 stdout,从而也重定向到 /dev/null(“2>&1”部分)。语法很奇怪,对吧?;-)
这高级 Bash 脚本指南还有更多有关 I/O 重定向的信息。
或者,您可以将 MAILTO 留空(即,在您的 crontab 中定义 MAILTO=""),这样您将不会收到任何邮件,根据 RHEL4 和 RHEL5 上 vixie-cron 的手册页。
答案2
作为重定向脚本输出的替代方法,您可以通过设置来更改 crontab 文件的邮件目的地MAILTO
,例如。MAILTO=nobody
答案3
修复问题而不是通知,
这会让你养成将所有通知发送到 >/dev/null 的坏习惯,而且,糟糕的是,你会错过一些重要的东西。
答案4
附加> /dev/null 2>&1 &
到命令末尾
例如
/directory/script.sh > /dev/null 2>&1 &