Содержание
Опасность упавшей cron-задачи в том, что не происходит ничего. Ни страницы ошибки, ни падения, ни разгневанных пользователей — только бэкап, который три недели назад тихо перестал выполняться, отчёт, который так и не отправился, или скрипт очистки, позволивший диску заполниться до тех пор, пока не лёг продакшен.
В самом cron нет никаких встроенных оповещений. Если задача завершается с ошибкой, cron просто пожимает плечами. Если в назначенное время сервер недоступен, задача попросту не запускается — и не остаётся ничего, что сообщило бы вам об этом. Именно второй случай упускает большинство систем мониторинга.
В этом руководстве — три схемы, которые ловят оба типа сбоев, и способ сделать оповещение невозможным для пропуска: эскалировать его до настоящего телефонного звонка с помощью Echobell.
Схема 1: оповещение о сбое по коду возврата
Самый простой подход: вызывать вебхук каждый раз, когда задача завершается с ненулевым статусом.
Сначала создайте канал в Echobell и скопируйте его URL вебхука. Затем оберните свою cron-команду:
0 3 * * * /opt/scripts/backup.sh || curl -s "https://hook.echobell.one/t/<channel-token>?title=Backup+failed&host=$(hostname)"
Если backup.sh отрабатывает успешно, не происходит ничего. Если падает — Echobell доставит оповещение на ваш телефон за считаные секунды. Параметры запроса становятся переменными шаблона, поэтому уведомление может точно указать, какая задача и на каком хосте завершилась с ошибкой.
Для длинных скриптов больше контекста даст trap:
#!/usr/bin/env bash
set -euo pipefail
notify_failure() {
curl -s -X POST "https://hook.echobell.one/t/<channel-token>" \
-H "Content-Type: application/json" \
-d "{\"job\":\"nightly-backup\",\"host\":\"$(hostname)\",\"line\":\"$1\"}"
}
trap 'notify_failure $LINENO' ERR
# ... логика вашей задачи ...
Ограничение: это работает только тогда, когда скрипт действительно запускается и падает. Если сервер недоступен, cron настроен неверно или кто-то закомментировал строку во время отладки, оповещение не сработает никогда. Поэтому вам нужна ещё и схема 2.
Схема 2: Dead man's switch для пропущенных запусков
Dead man's switch переворачивает логику: задача пингует монитор при успехе, а монитор оповещает вас, когда пинг не приходит по расписанию. Так отлавливаются все виды сбоев — ошибки, зависания, мёртвые серверы и удалённые строки crontab.
Два популярных решения с возможностью self-hosting хорошо работают вместе с Echobell:
- Healthchecks.io сделан ровно для этого. Создайте проверку с вашим cron-расписанием и допустимой задержкой, а затем добавьте
&& curl -s https://hc-ping.com/YOUR_UUIDв конец строки crontab. Если пинг опаздывает, Healthchecks отправляет вебхук — направьте его на ваш канал в Echobell, и пропущенный бэкап превратится в звонящий телефон. - Uptime Kuma содержит тип монитора «Push», работающий по тому же принципу: ваша задача обращается к push-URL, а Uptime Kuma оповещает через свои интеграции уведомлений, как только heartbeat перестаёт приходить.
В обоих случаях порядок такой: cron-задача → пинг об успехе → монитор замечает тишину → вебхук в Echobell → push-уведомление или звонок.
Схема 3: проверки по временному окну для задач, которые отдают данные
Некоторые задачи надёжнее проверять по результату, а не по коду возврата. Если ночной ETL должен вставить строки к 4 утра, небольшая проверочная задача может посмотреть количество строк и вызвать вебхук Echobell, когда цифры выглядят неправильно.
Здесь помогают условия Echobell: отправляйте статусный вебхук после каждого запуска и позвольте каналу решать, когда уведомлять. Условие вроде status != "ok" оставит успешные запуски беззвучными, а встроенные переменные времени в UTC ограничат оповещения тем окном, в котором задача должна была завершиться.
Как сделать оповещение невозможным для пропуска
Обнаружение — только половина задачи. Оповещение о сбое бэкапа, которое в 3 часа ночи приходит беззвучным баннером, функционально ничем не отличается от отсутствия оповещения.
В Echobell каждый канал выбирает свой уровень срочности:
- Обычное — стандартное push-уведомление, подходит для информационных задач
- Срочное — пробивается через «Фокусирование» в iOS, подходит для задач, на которые кто-то должен взглянуть в ближайшее время
- Звонок — телефон звонит как при настоящем вызове, пока вы не заметите
Для задач, где тихий сбой стоит реальных денег — бэкапы баз данных, биллинговые прогоны, обновление сертификатов, — переключите канал на Звонок. Разница между «увидел в 3 ночи» и «увидел в 9 утра» — это ровно та разница, которую даёт оповещение звонком.
Если за задачу отвечают несколько человек, поделитесь с командой ссылкой на подписку на канал; все подписчики получат одно и то же оповещение в один и тот же момент.
Какую схему выбрать?
- Хук по коду возврата: настройка за пять минут, ловит явные сбои. Начните с него.
- Dead man's switch: ловит ещё и пропущенные, и зависшие запуски. Добавьте его для каждой задачи, пропажу которой вы бы действительно заметили.
- Проверки данных по временному окну: для конвейеров, где «отработало успешно, но выдало мусор» — реальный риск.
Они хорошо сочетаются: хук по коду возврата сообщает, что задача упала и почему, а dead man's switch гарантирует, что вы узнаете и о тех сбоях, которые не успели заявить о себе.
Настройте первое оповещение для cron за несколько минут: скачайте Echobell, создайте канал и добавьте один curl в crontab. Когда в следующий раз задача по расписанию упадёт в 3 часа ночи, ваш телефон зазвонит — и бэкап, который вы будете восстанавливать в следующем квартале, действительно будет существовать.