Bash + cron: перенаправление и восстановление stdout и stderr приводит к отказу в доступе - PullRequest
0 голосов
/ 09 марта 2010

У меня есть скрипт, который вызывает несколько команд, некоторые из которых шумят для 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 выдает сообщение об отказе в разрешении. Мне непонятно почему.

Ответы [ 2 ]

2 голосов
/ 09 марта 2010

вместо

exec 2>&3

сделать

exec 3>&-
0 голосов
/ 11 марта 2010

Почему бы просто не перенаправить стандартный вывод в cronjob на / dev / null? Не используйте функцию be_quiet и измените die на:

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

Тогда, в вашем cronjob:

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

Вы должны получать почту от cron только тогда, когда ваш скрипт выводит что-то, используя функцию die.

...