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