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

发布于 2024-08-24 01:24:08 字数 662 浏览 10 评论 0原文

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

I've got a script that calls out to a bunch of commands, some of which are noisy to stdout, some to stderr, some to both. I intend the script to be run by cron, so I don't want it to be noisy and mail me every day -- only in error conditions. So I do:

be_quiet() {
  # save stderr in FD 3
  exec 3>&2 

  exec &> /dev/null
}

die() {
  # restore stderr
  exec 2>&3

  echo $* > /dev/stderr
  exit 1
}

Then, i.e.

be_quiet
mkdir -p $CLIENT_ROOT || die "Could not create client root."
cd $CLIENT_ROOT || die "Could not cd to client root."

The intent being that I get specific and meaningful-to-me messages if there is an error, and nothing otherwise. But what I'm seeing now is just

line 48: /dev/stderr: Permission denied

When run from the command line, this works. When run via cron, it gives the permission denied message. I'm unclear why.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

柠檬 2024-08-31 01:24:08

而不是

exec 2>&3

exec 3>&-

Instead of

exec 2>&3

do

exec 3>&-
请别遗忘我 2024-08-31 01:24:08

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

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

然后,在您的 cronjob 中:

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

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

Why not just redirect stdout in the cronjob to /dev/null? Don't use the be_quiet function, and change die to:

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

Then, in your cronjob:

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

You should only get mail from cron when your script outputs something using the die function.

不气馁 2024-08-31 01:24:08

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

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

这就是我想要的!

Many years later I've come across the perfect tool to solve the actual problem described in the first sentence: chronic, which:

runs a command, and arranges for its standard out and standard error to only be displayed if the command fails (exits nonzero or crashes). If the command succeeds, any extraneous output will be hidden.

This is what I wanted!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文