Вимкнути електронні листи, якщо немає помилок?


12

Як я можу отримувати електронні листи від cron лише у випадку помилок?

У переважній переважній більшості випадків завдання будуть виконуватись добре - і я справді не переймаюся результатом.

Я хочу / повинен знати лише в рідкісному випадку невдачі.

У мене доступна прокмейла - але я не впевнений, чи можна описати те, що я описую, керувати зовнішньо, щоб "правильно" виконувати крон.


Що робити, якщо сам crond не працює? Або машина в автономному режимі? Ось чому я ніколи не переймаюся електронними листами з cron і користуюся спеціалізованою службою моніторингу кронів. Я частковий до WDT.io і рекомендую його.
Крістіан Пекелер

Відповіді:


8

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

Так, наприклад:

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

відправить пошту, коли є вихід тільки на STDERR (за допомогою STDERR), і відкине STDOUT.

Звичайно, це передбачає, що коли програма написана на STDERR, не вдалося; це може бути не завжди так. Якщо у вас є контроль над програмою, ви можете змусити це зробити. Для будь-якого складного випадку вам слід написати обгортку якогось типу, яка виконує команди (и) і відповідно надіслати пошту. І поставити обгортку як cronроботу.


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

11

chronicКоманда з moreutils запускає команду спокійно , якщо це не вдається.

Цитуючи його посібник:

хронічний запускає команду і впорядковує, що її стандартна помилка та стандартна помилка відображатиметься лише в тому випадку, якщо команда не працює (виходить з ненульового рівня або збивається). Якщо команда успішна, будь-який сторонній вихід буде прихований.

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


8

Як я можу отримувати електронні листи від cron лише у випадку помилок?

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

Щоб використовувати cronic, завантажте скрипт в потрібному місці, наприклад /usr/local/bin. Ваші записи на кронтабелі повинні бути встановлені префіксом шляхом до сценарію (наприклад /usr/local/bin/cronic), або просто за cronicумови PATHправильного налаштування.

Зверніть увагу, що "помилки" - це неправильно визначений термін у вашому запитанні і вимагає ретельного визначення. Щоб cronic був корисним, ви повинні забезпечити завдання, які ви обробляєте з помилками хронічного звіту, одним із способів, за яким він визначає стан помилки. Неявні методи звітності, такі як написання текстових рядків STDOUT, потребують подальшої думки, щоб зробити це сумісним із кронічним чи іншим механізмом звітування про хрони.

Інші обгортки доступні, як це пов’язано з веб-сайтом хроніки:


1
Чи cronicпов’язано це chronicчи це просто збіг?
Toby Speight

@TobySpeight Збіг, здається. cronicреалізовано в bash, chronicяк запропоновано в попередній відповіді , це сценарій Perl.
Cosmic Ossifrage

4

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

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

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, ви все одно отримаєте електронні листи.


Ви повинні поставити $OUTPUTв лапки: "$OUTPUT".
G-Man каже: "Відновіть Моніку"

@ Справедливий пункт G-Man, завжди є ймовірність, що вихід може містити "-n" або щось подібне.
Аком

0

Я, мабуть, не думав про це весь шлях, але

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

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

Якщо пам'ять служить, cron вже нічого не надсилає, якщо виходу не було, тому якщо файл журналу порожній або його не існує, нічого не відбувається. (Ми переспрямовуємо повідомлення про помилку.)

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