Отключить сообщения электронной почты cron, если нет ошибок?

Самый простой способ - просто нажать ctrl+alt+del для мягкого сброса, но вам придется снова пройти POST.


Другой способ, из приглашения к спасению:

замените hd0,gpt2 на соответствующее значение для вашей машины - в моей системе оно отображается как часть приглашения пароля. Я использую btrfs без lvm (и без отдельного раздела /boot), поэтому ваши параметры cryptomount и prefix могут несколько отличаться от моих:

cryptomount hd0,gpt2
set prefix=(crypto0)/__active/boot/grub
insmod normal
normal
12
20.06.2017, 06:19
5 ответов

Возможно, я не продумывал это до конца, но

* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null

в обычных случаях перенаправляет все во временный файл (вы, вероятно, захотите использовать mktempдля получения уникального имени файла), удалите его, если файл был успешно создан, а затем снова catсодержимое, если оно все еще существует (т.е. хрон почтовик.

Если не изменяет память, cron уже ничего не отправляет, если не было вывода, так что если лог-файл пустой или не существует, ничего не происходит. (Мы перенаправляем сообщение об ошибке.)

0
27.01.2020, 19:54

Команда chronicиз moreutilsвыполняет команду спокойно, если она не завершается ошибкой.

Цитата из его руководства:

Chronic запускает команду и принимает меры, чтобы ее стандартный вывод и стандартная ошибка отображались только в случае сбоя команды (выход ненулевой или сбой). Если команда выполнена успешно, любой посторонний вывод будет скрыт.

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

14
27.01.2020, 19:54

Как я могу получать электронные письма от cron только в случае ошибок?

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

Чтобы использовать cronic, загрузите скрипт в подходящее место, например /usr/local/bin. Ваши записи в crontab должны начинаться с пути к скрипту (например, /usr/local/bin/cronic) или просто cronic, при условии, что ваш PATHустановить правильно.

Обратите внимание, что термин «ошибки» в вашем вопросе является нечетким и требует тщательного определения. Чтобы cronic был полезен, вы должны убедиться, что задания, в которые вы переносите сообщения об ошибках cronic, одним из способов, которыми он определяет состояние ошибки. Неявные методы создания отчетов, такие как запись текстовых строк в STDOUT, потребуют дальнейшего рассмотрения, чтобы сделать их совместимыми с cronic или другим механизмом отчетов cron.

Доступны и другие обертки, ссылки на которые можно найти на сайте cronic:

9
27.01.2020, 19:54

Поскольку вы не заботитесь о выводе, вы можете перенаправить STDOUT задания на /dev/null и разрешить отправку STDERR по почте ( используя переменную окружения MAILTO).

Так, например:

...
...
MAILTO=foobar@example.com
...
...
* * * * * /my/script.sh >/dev/null

будет отправлять почту, когда есть вывод только на STDERR (с STDERR), и отбрасывает STDOUT.

Это, конечно, предполагает, что когда программа записывалась в STDERR, произошел сбой; это может быть не всегда так. Если у вас есть контроль над программой, вы можете заставить ее это делать. Для любого сложного случая вы должны написать какую-нибудь оболочку, которая запускает команду (команды) и соответственно отправляет почту. И поместите обертку как задание cron.

12
27.01.2020, 19:54

Вот еще один вариант, который я успешно использовал в течение многих лет -захвата вывода и вывода его только при ошибке . Для этого не требуются временные файлы, и сохраняет все выходные данные . Важной частью является 2>&1, который перенаправляет STDERR на STDOUT.

Отправить все выходные данные через конфигурацию почтовой программы cron по умолчанию:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"

То же, но с конкретным адресом и темой:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" an@email.address

Вы даже можете выполнить несколько действий при ошибке и добавить в электронное письмо:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || {echo "$OUTPUT" ; ls -ltr /backup/dir ; }

Это будет работать для простых команд. Если вы имеете дело со сложными каналами (find / -type f | grep -v bla | tar something-or-other), вам лучше перенести команду в скрипт и запустить скрипт, используя вышеупомянутый подход. Причина в том, что если какая-либо часть канала выводит в STDERR, вы все равно будете получать электронные письма.

5
27.01.2020, 19:54

Теги

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