我有一个 crontab (root),它运行一个脚本,并将输出设置为 > /dev/null,但每次运行时我都会收到电子邮件。我只想收到错误电子邮件。
# Rackspace driveclient update (12pm MST)
0 12 * * * /root/scripts/driveclient-update > /dev/null
我唯一可以关闭它的方法是使用 > /dev/null 2>&1,但这样我就不会收到错误电子邮件。这发生在三台不同的 CentOS 服务器上,其中两台是 6.3,一台是 6.4。
笔记:我反复读过 > /dev/null 应该将标准输出发送到那里,如果脚本中只有标准输出,则阻止发送电子邮件,所以至少对某些人来说是有效的;我不明白为什么它在这些服务器上不起作用。
下面是 > /dev/null 应该如何工作的示例:
使用MAILTO
变量
该
MAILTO
变量允许您设置 Cron 发送通知电子邮件的电子邮件地址。您可以将其设置为空字符串,以隐藏来自 Cron 作业的所有电子邮件,如下所示:$ crontab -e
现在在文件顶部添加:
MAILTO=""
然后保存并关闭文件。
发送输出至/dev/null
Linux 中的位置
/dev/null
是数据的“黑洞”:发送到这里的任何输出都会消失,这使其成为抑制 Cron 作业输出的绝佳选择。要抑制 Cron 作业的所有输出(STDOUT 和 STDERR),请附加
> /dev/null 2>&1
到作业末尾:$ crontab -e
例子:
*/30 * * * * command > /dev/null 2>&1
数字 2 代表 STDERR(标准错误)流,而 1 代表 STDOUT(标准输出)流。
如果您只想接收有关错误的电子邮件,而不是成功的电子邮件,请将 > /dev/null 附加到您的作业以仅抑制来自 STDOUT 的输出:
*/30 * * * * command > /dev/null
最初是从alphadevx.com - 禁止 Cron Job 电子邮件通知(链接已失效)
答案1
设置MAILTO="[电子邮件保护]“在 crontab 文件中。并让你的脚本'回声' stderr 或 stderr 当抛出异常时$(子外壳)任何事情都有可能发生,因此请使用返回值(0 是可以的,其他任何值都是例外)像本例中一样:
#!/bin/bash
return=$(/usr/bin/curl --silent --show-error --fail "http://server/somestate" 2>&1)
exitcode=$?
if [ $exitcode != 0 ]
then
echo "ERROR $HOSTNAME $0 $exitcode $return"
logger "ERROR $HOSTNAME $0 $exitcode $return"
exit $exitcode
else
logger "INFO $HOSTNAME $0 $exitcode $return"
exit 0
fi
答案2
>
仅重定向 std out/err,电子邮件是脚本最类似的内部函数。检查脚本-h
中的可选参数或 rackspace 实用程序文档
答案3
我发现 wget 和 yum 将 stdout 发送到 stderr,所以我不得不将所有内容传送到日志文件。
答案4
这是我很久以前找到的一个解决方案,在 crontab 中使用以下命令。这假设您只在脚本返回非零时才想要一封电子邮件。
# Rackspace driveclient update (12pm MST)
0 12 * * * if ! out="$(/root/scripts/driveclient-update 2>&1)"; then echo "$out"; fi