Bash + cron:重定向和恢复,stdout和stderr会产生权限被拒绝

时间:2010-03-09 14:57:49

标签: bash cron stdout stderr

我有一个脚本可以调出一堆命令,其中一些命令对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运行时,它会给出权限被拒绝的消息。我不明白为什么。

3 个答案:

答案 0 :(得分:2)

而不是

exec 2>&3

DO

exec 3>&-

答案 1 :(得分:0)

为什么不将cronjob中的stdout重定向到/ dev / null?不要使用be_quiet函数,并将die更改为:

die() {
    echo "$*" >&2
}

然后,在你的cronjob中:

* * * * * /path/to/script.sh >/dev/null

当您的脚本使用die函数输出内容时,您应该只从cron获取邮件。

答案 2 :(得分:0)

很多年后,我遇到了一个完美的工具,可以解决第一句话chronic中描述的实际问题,

运行命令,并安排其标准输出和标准错误仅在命令失败(非零退出或崩溃)时显示。如果命令成功执行,则任何多余的输出都将被隐藏。

这就是我想要的!