Переходите с UptimeRobot? Импортируйте мониторы одним кликом по ключу API только для чтения.Начать бесплатно →
  1. Главная
  2. Мониторинг
  3. Мониторинг cron-задач

Мониторинг cron: узнайте, когда задача не выполнилась

У каждого heartbeat-монитора есть свой URL для пинга. Задача вызывает его по завершении, и если следующий пинг не приходит в течение периода плюс запаса времени, открывается инцидент.

  • От $7 в месяц на Starter
  • Тариф Free: 30 мониторов для HTTP(S), ключевых слов, ping и портов
  • Free без банковской карты
nightly-backupОжидаем каждый час · запас 5 мин
вовремя

пинг получен 2 мин назад

Последний пинг
2 мин назад
Время последнего запуска
14 мин
Следующий пинг через
58 мин
Запас времени
5 мин

Иллюстративный пример

Попробуйте

Проверьте прямо сейчас, в браузере

Без регистрации. Мониторинг cron-задач: введите адрес и посмотрите, что именно отслеживает такой монитор. Ничего из введённого не сохраняется.

Замените hb_YOUR_TOKEN на токен созданного монитора. Благодаря && неудачный скрипт не отправляет пинг, а -fsS молчит, пока curl не сбоит.

Результат появится здесь.

Создать такой монитор

Что проверяет

Что именно проверяет этот монитор

Пропущенный пинг

Вы задаёте, как часто задача должна пинговать, и запас времени в секундах. Нет пинга к этому сроку — открывается инцидент.

Пинг о сбое

Вызов /fail сразу помечает задачу как неудачную и сохраняет ваше сообщение или код выхода в качестве причины.

Пинг о старте

Вызов /start фиксирует, что запуск начался. Он появляется в истории монитора, но дедлайн определяют пинги о завершении.

Вывод задачи

Тело POST-запроса (или ?msg=) до 10 КБ сохраняется вместе с пингом, так что последние строки лога попадают в инцидент.

Оповещения

Мониторинг cron-задач: как выглядит оповещение

Одно и то же событие приходит письмом, сообщением в Telegram или карточкой в Slack. Это текст, который отправляют каналы; хост, время и числа выдуманы.

Кому [email protected]

Тема [MISSED] nightly-backup — Heartbeat missed, last ping 26 h ago

MISSED

nightly-backup

nightly-backup · Heartbeat missed, last ping 26 h ago

ErrorHeartbeat missed, last ping 26 h ago
Since14:02:11 UTC
Target/hb/hb_••••••••
Next stepThe job did not ping on time. Check the cron/task runner and its logs.

AcknowledgeOpen incident

Tenium · checked from Amsterdam · 14:02 UTC

Tenium alerts

🔴 MISSED · nightly-backup · Heartbeat missed, last ping 26 h ago

TTenium APP 2:02 PM

MISSED · nightly-backup
nightly-backup · Heartbeat missed, last ping 26 h ago

  • Error: Heartbeat missed, last ping 26 h ago
  • Target: /hb/hb_••••••••

Подтвердить получениеOpen incident

The job did not ping on time. Check the cron/task runner and its logs. · checked from Amsterdam

Мониторинг cron-задач: e-mail, Discord и Google Chat работают на всех тарифах, Slack, Telegram, Teams и Mattermost — с тарифа Starter. SMS и голосовых звонков нет.

Длительность задачи

Сколько обычно длится ночная задача

Heartbeat с /start и финальным пингом даёт ещё и длительность каждого запуска, поэтому задача, которая вдруг идёт втрое дольше, заметна сразу.

Время выполнения Порог иллюстративные данные
Сколько обычно длится ночная задача. Иллюстративные данные. 012.52537.550 Порог 40 мин 00:0006:0012:0018:0024:00 Время выполнения (мин)
Heartbeat с /start и финальным пингом даёт ещё и длительность каждого запуска, поэтому задача, которая вдруг идёт втрое дольше, заметна сразу.
Скорость

Насколько поздно задача может запуститься, прежде чем вы узнаете

У heartbeat нет проверок по расписанию. Вы сами задаёте период, в который задача должна пинговать, и запас времени; обнаружение — их сумма.

Задача запускается каждые
Запас времени
О пропущенном запуске узнаете через1,2 ч

Пропущенный пинг — это не сетевое измерение, поэтому подтверждение из нескольких регионов здесь не нужно: оповещение уходит, как только прошёл дедлайн.

Настройка

Как настроить мониторинг cron-задач за 30 секунд

1

Создайте heartbeat

Выберите тип Heartbeat, назовите задачу и укажите, как часто она должна пинговать и какой запас времени допустим, оба значения в секундах.

2

Скопируйте URL для пинга

После сохранения создаётся уникальный адрес вида /hb/<token> на хосте приложения Tenium. Пинговать может любой, кто знает адрес, поэтому относитесь к нему как к секрету.

3

Добавьте в задачу один вызов

Допишите вызов curl -fsS в строку cron или вызовите адрес в конце своего скрипта.

4

Выберите контакты для оповещений

Пропуски heartbeat не проходят подтверждение из нескольких регионов, потому что ничего сетевого не проверяется.

Режимы сбоев

Что означает каждая ошибка

Это текст, который инцидент показывает в строке «Error», типичная причина и что проверить первым.

MISSEDHeartbeat missed, last ping 26 h ago

Дедлайн (период плюс запас) прошёл без пинга: под подозрением демон cron, сервер, скрипт или сетевой вызов. Сначала загляните в собственный лог задачи.

Выглядит как: Heartbeat missed, last ping 26 h ago

NEVERHeartbeat missed, never pinged (created 3 h ago)

Монитор создан, но первый пинг так и не пришёл: обычно неверный адрес или задача, которую так и не добавили в расписание.

Выглядит как: Heartbeat missed, never pinged (created 3 h ago)

/failJob reported failure (exit 2)

Ваш скрипт вызвал /fail, поэтому инцидент открывается сразу, а причиной становятся ваше сообщение или код выхода. Ждать дедлайна не нужно.

Выглядит как: Job reported failure (exit 2)

LATEJob ran, ping arrived late

Запуск оказался дольше периода плюс запас. Если это повторяется, увеличьте запас или исправьте медленную задачу.

Выглядит как: Job ran, ping arrived late

SILENTScript failed but the ping still went out

Без && (или ловушки с /fail) curl выполняется, даже если скрипт упал. Ставьте пинг в цепочку после команды.

Выглядит как: Script failed but the ping still went out

Тарифы

Мониторинг cron-задач: что входит в тарифы

Free
$0/мес.
Starter
$7/мес.
Pro
$29/мес.
Agency
$59/мес.
Доступно—✓✓✓
Мониторы301003001000
Самый быстрый интервал5 мин1 мин30 с30 с
Регионы1222
Heartbeat для cron—20100500
Собственные заголовки——✓✓
Оповещения о медленном ответе——✓✓
Эскалация на второй контакт——✓✓
Страницы статуса1310Без ограничений

Эта проверка доступна с тарифа Starter. Проверки HTTP(S), ключевых слов, ping и портов есть на всех тарифах.

Все тарифы

Как определяется опоздание

У heartbeat-монитора два числа, оба в секундах: как часто задача должна пинговать и какой запас времени допустим. Дедлайн — это время последнего пинга о завершении плюс период плюс запас. Как только часы проходят этот момент, открывается инцидент с сообщением вроде «Heartbeat пропущен, последний пинг 26 часов назад». До первого пинга отсчёт идёт от момента создания монитора, поэтому новый heartbeat, от которого задача так и не дала о себе знать, тоже оповещает.

Дедлайн сдвигается вместе с каждым пингом и не привязан к настенным часам. Ночной бэкап с периодом 86400 и запасом 3600 считается опоздавшим, если следующий пинг пришёл позже чем через 25 часов после предыдущего. Отсюда практический вывод: выбирайте запас так, чтобы он покрывал самый долгий обычный запуск вместе с разбросом старта. Если задача стартует в 03:00, обычно заканчивается к 03:20, но иногда идёт 80 минут, запас в час слишком мал, а два часа безопасны. Дедлайны проверяются с интервалом самого монитора, поэтому оповещение может отставать от дедлайна на один интервал.

Три адреса

После сохранения монитора вы получаете адрес для пинга вида https://YOUR-APP-HOST/hb/hb_TOKEN. Токен — единственный секрет, поэтому не кладите его в публичные репозитории. Работают и GET, и POST, а успешный вызов отвечает «ok».

  • Сам адрес или /finish: задача выполнена. Дедлайн сбрасывается, открытый инцидент закрывается, и отправляется оповещение о восстановлении.
  • /fail: задача завершилась неудачно. Инцидент открывается сразу, не дожидаясь дедлайна, а причиной становится отправленное вами сообщение.
  • /start: задача стартовала. Это сохраняется в истории монитора, так что виден запуск, который начался и не закончился, но дедлайн не сдвигается.
  • Заметки: ?msg=текст или ?exit=2 в GET-запросе либо тело POST до 10 КБ, например хвост лога. Инцидент покажет их.

Рецепты с curl

Делайте эти однострочники короткими, остальное сделает оболочка. Подставьте свой адрес.

  • Обычный cron: 0 3 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 --retry 3 https://YOUR-APP-HOST/hb/hb_TOKEN > /dev/null. Из-за && неудачный скрипт пинг не отправляет, и срабатывает оповещение о пропуске.
  • Немедленное оповещение о сбое: backup.sh && curl -fsS $URL || curl -fsS "$URL/fail?msg=backup+failed". Вторая ветка сразу открывает инцидент.
  • Вывод в оповещении: out=$(backup.sh 2>&1); curl -fsS --data-binary "$out" $URL/finish. В ветке сбоя вызывайте $URL/fail, чтобы хвост лога попал в инцидент.
  • systemd: добавьте ExecStartPost=/usr/bin/curl -fsS https://YOUR-APP-HOST/hb/hb_TOKEN в сервис типа oneshot, чтобы вызов выполнялся только после успешного завершения основной команды.
  • Kubernetes CronJob или CI: поставьте curl последним шагом скрипта задачи, в GitHub Actions или GitLab — завершающим шагом запланированного workflow.

Расписания, которые форма не умеет описать

Heartbeat работает с обычным периодом, а не с выражением cron и не с часовым поясом. Поэтому задаче, которая запускается только по будням, нужен период, достаточный, чтобы перекрыть выходные, например 3 суток, а это значит, что сбой в пятницу заметят только в понедельник. Лучше так: период в одни сутки и два монитора, или пусть задача пингует каждый день, включая пинг «делать нечего» в выходные. Для ежемесячных задач подойдёт период 32 дня плюс сутки запаса. Чтобы посчитать реальный интервал между запусками необычного выражения, воспользуйтесь конструктором cron.

Что heartbeat замечает, а что нет

Он замечает всё, что не даёт задаче дойти до последней строки: остановленный демон cron, перезагрузку, после которой запись отключилась, заполненный диск, изменённый PATH, истёкший пароль, зависший процесс, который никогда не завершается, и ошибочную правку crontab. Он не может знать, что завершившаяся задача ещё и выполнилась правильно. Скрипт бэкапа, который завершается с кодом ноль после записи пустого файла, спокойно отправит пинг. Ставьте пинг после шага проверки, например после проверки размера файла или подсчёта строк, чтобы успех что-то значил.

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

Лимиты и тарифы

Heartbeat-мониторы начинаются со Starter, на Free их нет. Количество: 20 на Starter, 100 на Pro и 500 на Agency. Каждый адрес для пинга принимает до 30 вызовов в минуту, а с одного IP-адреса на все токены вместе разрешено 60. Сверх этого эндпоинт отвечает 429, так что пинговать чаще раза в несколько секунд из загруженного цикла бессмысленно. Для воркеров очередей пингуйте раз в минуту с периодом 120 и запасом 60. Каналы оповещений такие же, как у любого монитора, а для ночной задачи, которая не имеет права упасть, с тарифа Pro доступна эскалация, см. эскалацию оповещений. Форматы адресов перечислены в документации heartbeat API.

Частые вопросы: мониторинг cron-задач

Что делать, если у сервера нет выхода в интернет?

Задаче нужно сделать один исходящий HTTPS-запрос, поэтому изолированный от сети хост не может отчитаться напрямую. Пусть соседняя машина, которая нас видит, вызывает heartbeat после того, как прочитает файл статуса с изолированной.

Можно ли создавать heartbeat через API?

Да, как монитор типа heartbeat с периодом и запасом времени. Запрос показан в документации API, а доступ на запись требует тарифа Pro или выше.

Защищён ли адрес для пинга аутентификацией?

Учётными данными служит случайный токен в адресе. Если он утёк, удалите монитор и создайте новый, чтобы старый адрес перестал работать.

Считаются ли пинги проверками, за которые я плачу?

Нет. Heartbeat — это один монитор в общем лимите тарифа, а количество пингов на это не влияет, кроме ограничения по частоте.

Попробуйте мониторинг cron-задач на Starter

Эта проверка начинается с тарифа Starter за $7 в месяц. Тариф Free, без банковской карты, даёт 30 мониторов с проверками HTTP(S), ключевых слов, ping и портов.