Назад | Перейти на главную страницу

Cron: Ошибки появляются только в письмах?

Наконец, я установил реалистичное расписание резервного копирования своих данных с помощью сценария оболочки, который обрабатывает cron через короткие промежутки времени. К сожалению, я продолжаю получать пустые электронные письма каждый раз, когда выполняется CRON, а не только когда что-то идет не так.

Можно ли заставить CRON отправлять электронные письма только тогда, когда что-то идет не так, т.е. мой TAR не выполняется как задумано?

Вот как настроен мой crontab на данный момент;

0 */2 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

Большое спасибо!

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

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh

Если ваш скрипт обычно производит вывод, но вас это не волнует в cron, просто отправьте его в / dev / null, и он отправит вам электронное письмо только тогда, когда что-то будет написано в stderr.

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh > /dev/null

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

Вместо того:

 0 1 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

делать:

 MAILTO=email@example.com
 0 1 * * * cronic /bin/backup.sh

Проще говоря; он будет работать беззвучно, если все работает нормально (статус выхода 0), но он будет подробно сообщать, если нет, и позволяет cron обрабатывать отчеты по электронной почте.

Больше информации на https://habilis.net/cronic/.

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

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

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

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

(адрес также можно изменить, установив ПОЧТА = xxxx для всего файла crontab)

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, вы все равно будете получать электронные письма.

Вы специально инструктируете cron всегда отправлять электронную почту, даже когда /bin/backup.sh (кстати, он должен быть в /usr/local/bin) успешно. Просто опустите | mail -s "Backup status" email@example.com часть и электронное письмо будут отправлены только при наличии вывода. Вы, вероятно, можете (в зависимости от вашего cron) явно установить адрес электронной почты для отправки в качестве назначения в файле crontab.

Подробнее см.

man 5 crontab

Вы должны направлять stderr и не оба stdout и stderr.

Использовать 1> /dev/null не 2>&1 и все должно быть хорошо. Кроме того, вам может потребоваться правильно сообщить об ошибке в сценарии резервного копирования.