下面的代码应该将所有输出重定向到 /dev/null,但是 root 仍然会收到一封包含第一个命令(/usr/bin/svnadmin)输出的电子邮件。为什么?
#!/bin/sh
# Dump repo and upload via tarsnap
/usr/bin/svnadmin dump /srv/repos/www | gzip > /srv/repos/backup/www-repo-`date --iso-8601`.gz > /dev/null 2>&1
/usr/local/bin/tarsnap -c -f www-repo-`date --iso-8601` /srv/repos/backup/www-repo-`date --iso-8601`.gz > /dev/null 2>&1
答案1
您已将第二个命令的 STDOUT 和 STDERR 通过管道传输到 /dev/null,并且仅将第一个命令的 STDOUT 通过管道传输到第二个命令。因此,第一个命令的 STDERR 已通过电子邮件发送给您。
你应该写
( /usr/bin/svnadmin dump /srv/repos/www | gzip > /srv/repos/backup/www-repo-`date --iso-8601`.gz ) > /dev/null 2>&1
答案2
由于我的声誉,我无法添加评论,所以我必须提交答案,尽管我不确定是否如此。
你的 crontab 是什么样的?我不认为是你的脚本发送电子邮件,而是 cron/crontab 在做这件事。所以请向我们展示你的 crontab 的内容(crontab -e)。
我可能错了(实际上昨天我第一次使用 cron),但我认为你应该把这个> /dev/null 2>&1
部分放在你的 crontab 中,而不是脚本文件中。所以你的 crontab 可能看起来像这样:
@hourly /your/script/location > /dev/null 2>&1
希望这可以帮助。