我有一个脚本,可以调用一堆命令,其中一些命令对stdout有害,一些命令对stderr干扰,有些对两者都有害。我希望脚本由cron运行,所以我不希望它嘈杂并每天发送邮件给我-仅在错误情况下。所以我这样做:
be_quiet() {
# save stderr in FD 3
exec 3>&2
exec &> /dev/null
}
die() {
# restore stderr
exec 2>&3
echo $* > /dev/stderr
exit 1
}
然后,即
be_quiet
mkdir -p $CLIENT_ROOT || die "Could not create client root."
cd $CLIENT_ROOT || die "Could not cd to client root."
目的是,如果有错误,我会收到具体且有意义的消息,否则就什么也没有。但是我现在看到的只是
line 48: /dev/stderr: Permission denied
从命令行运行时,此方法有效。通过cron运行时,它会给出权限被拒绝的消息。我不清楚为什么。
代替
exec 2>&3
做
exec 3>&-
为什么不只是将cronjob中的stdout重定向到/ dev / null?不要使用be_quiet函数,将die更改为:
die() {
echo "$*" >&2
}
然后,在您的cronjob中:
* * * * * /path/to/script.sh >/dev/null
仅当脚本使用die函数输出某些内容时,才应从cron接收邮件。
很多年后,我遇到了完美的工具来解决第一句话中描述的实际问题:chronic,其中:
运行命令,并安排其标准输出和标准错误仅在命令失败(非零退出或崩溃)时显示。如果命令成功执行,则任何多余的输出都将被隐藏。
这就是我想要的!