Cron: Лише отримувати помилки в електронних листах?


39

Нарешті я встановив реалістичний графік резервного копіювання моїх даних за допомогою скрипту оболонки, який обробляється cron через строгі інтервали. На жаль, я постійно отримую порожні електронні листи щоразу, коли CRON виконується, і не лише тоді, коли справи йдуть не так.

Чи можливо змусити CRON надсилати електронні листи, коли щось піде не так, тобто. мій TARне виконується за призначенням?

Ось як налаштовано мій crontab на даний момент;

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

Дуже дякую!

Відповіді:


54

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

9
Це навряд чи ідеально. Як правило, ви хочете, щоб весь результат (stdout + stderr) був надісланий вам електронною поштою, коли команда закінчується ненульовим кодом помилки. В іншому випадку, як правило, добре погладити, як мінімум, стрибун. Для мене це недолік дизайну cron.
Вітіко

3
@Witiko Я згоден; Я знайшов це питання, намагаючись виправити це. Я думаю, ти можеш скласти свою команду cron /bin/backup.sh > log_file || (echo Backup failed with exit status $?; cat log_file)?
Даніель Н

22

Використання хронічного сценарію обгортки виглядає непоганою ідеєю; щоб використовувати його, вам не потрібно змінювати сценарії.

Замість:

 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/ .


Я дійсно не бачу, як це допоможе, коли проблема - це не що інше, як неправильна лінія крона, а cron робить саме те, що йому сказано.
John Gardeniers

3
@JohnGardeniers це допомагає, оскільки іноді ви отримуєте результат без помилок.
Михайло

11
Як варіант, chronicз moreutilsпакета: joeyh.name/code/moreutils
Володимир Пантелеев

4

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

Детальніше див

man 5 crontab

3

Ви повинні керувати stderranmd не обома, stdoutа stderr.

Використовуйте 1> /dev/nullне, 2>&1і це повинно бути добре. Крім того, можливо, вам доведеться правильно повідомити про помилку у своєму резервному скрипті.


3

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

Надішліть весь вихід через конфігурацію електронної пошти за замовчуванням:

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

Те саме, але з конкретною адресою та темою:

(адресу можна також змінити, встановивши MAILTO = 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, ви все одно отримаєте електронні листи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.