即使使用 > /dev/null,crontab 仍会发送电子邮件

即使使用 > /dev/null,crontab 仍会发送电子邮件

我有一个 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

相关内容