Только электронная почта об ошибках cron для рабочих мест в cron.daily, cron.hourly и т. Д.

6090
jrdioko

У меня есть несколько рабочих мест хрон, которые работают (в /etc/cron.daily, /etc/cron.hourly, /etc/cron.weeklyи т.д.) и электронную почту root@localhostс результатами. Я хотел бы остановить эти электронные письма, если задания выполняются успешно, и только электронную почту при ошибке (что, как я понимаю, можно сделать, перенаправив stdoutна /dev/null). Я понимаю, как это сделать для отдельных заданий cron, но сценарии в этих специальных каталогах запускаются с использованием run-parts. Каков наилучший способ подавления успешных писем для этих сценариев?

7

3 ответа на вопрос

5
pavium

Вы должны отправить успешные уведомления по электронной почте, /dev/nullчтобы они исчезли.

Но вы хотите видеть неудачные уведомления по электронной почте.

Это означает, что необходимо сначала направить stdoutна, /dev/nullа затем направить /dev/stderrвstdout

попробуйте изменить часть перенаправления ваших cronjobs на

>/dev/null 2>&1 

Смотрите эту ссылку

Разве это не подавляло бы электронные письма об ошибках (потому что они не производили бы никакого вывода)? Кроме того, мне нужно сделать это для моих каталогов `cron.XXX`, которые используют` run-parts`, так что это не так просто, как перенаправление для отдельных скриптов. jrdioko 13 лет назад 0
Нет, идея в том, что `stderr` выбрасывается *, а затем *` stderr` перенаправляется на `stdout`. Я не уверен, что такое `run-parts`, но как бы то ни было, он работает с перенаправлением` stdout`, и тогда `stderr` кажется подходящим. pavium 13 лет назад 0
Ага, я погуглил "run-parts". Это усложняет проблему, не так ли? Возможно, вам следует избегать `run-parts` и вызывать каждый скрипт отдельно. pavium 13 лет назад 0
Ах, хорошо, я понимаю. `run-parts` запускает все сценарии в таких каталогах, как` / etc / cron.daily`, поэтому трюк заключается в перенаправлении на отдельные сценарии, которые он выполняет. jrdioko 13 лет назад 0
Я думаю так. Я не смог найти ничего о перенаправлении * всего * вывода из `run-parts` (даже на странице man, которую я только что обнаружил, у меня есть). pavium 13 лет назад 0
Вы уверены насчет бита `> / dev / null 2> & 1`? Я проверил это, и он направляет все в `/ dev / null`, где, если вы уроните` 2> & 1`, будет удален только стандартный вывод. jrdioko 13 лет назад 2
5
Cyryl Płotnicki

Возможно, вы захотите использовать одну из оболочек для программ, которые выводят все, когда что-то идет не так, и проглатывают стандартный вывод.

Одним из примеров может быть cronic, просто добавьте «cronic» к «run-parts», например:

# m h dom mon dow user command 17 * * * * root cd / && /etc/cronic run-parts --report /etc/cron.hourly 

где /etc/cronicместо с исполняемым скриптом cronic, скачанное с упомянутого сайта.

1
morallo
  • If the script is well behaved, it will write only to STDOUT if successful, and to STDERR in case there is an error.
  • By default, cron will mail everything that the script writes into STDOUT or STDERR (Arch wiki).

So, if you want to keep error notifications, don't redirect STDERR, just STDOUT:

COMMAND > /dev/null 

If you do the typical >/dev/null 2>&1, you are effectively suppressing both (bash documentation).

  1. Make stdin file descriptor a copy of /dev/null.
  2. Make stderr file descriptor a copy of stdout (that already pointed to /dev/null).
Даже если это не полностью отвечает на первоначальный вопрос, оно устраняет некоторые ошибки в [ответе pavium] (https://superuser.com/a/290058/491366). morallo 9 лет назад 0

Похожие вопросы