Bash + cron:重定向,以及还原,stdout和stderr产生权限被拒绝

问题描述 投票:-1回答:3

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

bash cron stdout stderr
3个回答
2
投票

代替

exec 2>&3

exec 3>&-

0
投票

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

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

然后,在您的cronjob中:

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

仅当脚本使用die函数输出某些内容时,才应从cron接收邮件。


0
投票

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

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

这就是我想要的!

© www.soinside.com 2019 - 2024. All rights reserved.