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 运行时,它会给出权限被拒绝的消息。我不清楚为什么。
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
而不是
做
Instead of
do
为什么不直接将 cronjob 中的 stdout 重定向到 /dev/null 呢?不要使用 be_quiet 函数,并将 die 更改为:
然后,在您的 cronjob 中:
当您的脚本使用 die 函数输出某些内容时,您应该仅从 cron 接收邮件。
Why not just redirect stdout in the cronjob to /dev/null? Don't use the be_quiet function, and change die to:
Then, in your cronjob:
You should only get mail from cron when your script outputs something using the die function.
许多年后,我遇到了完美的工具来解决第一句话中描述的实际问题: 慢性,其中:
这就是我想要的!
Many years later I've come across the perfect tool to solve the actual problem described in the first sentence: chronic, which:
This is what I wanted!