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

Повышаем надежность фоновый задач с повторными попытками и уведомлениями

Проблема cron-задач

Если cron-задача не выполнится — вы не всегда узнаете об этом. Ошибка в скрипте, зависание, сбой сети — задача просто «молча» не выполнится. Чтобы избежать потерь, нужен мониторинг и автоматический retry.

Что мы будем настраивать

  • Мониторинг успешного выполнения cron-задачи
  • Повтор при ошибке
  • Уведомление, если задача не завершилась после нескольких попыток

1. Обернем задачу в bash-скрипт

Создадим обертку, которая будет повторять задачу до 3 раз при неудаче:

#!/bin/bash

MAX_RETRIES=3
RETRY_DELAY=10
COUNT=0
SUCCESS=0

while [ $COUNT -lt $MAX_RETRIES ]; do
  echo "Попытка $((COUNT+1))..."
  /usr/bin/python3 /scripts/my_task.py && SUCCESS=1 && break
  COUNT=$((COUNT+1))
  sleep $RETRY_DELAY
done

if [ $SUCCESS -eq 1 ]; then
  curl -fsS https://ev.okchecker.ru/p/<api-key>/backup-db > /dev/null
else
  curl -fsS https://ev.okchecker.ru/p/<api-key>/backup-db?status=fail > /dev/null
fi

2. Настроим cron

Добавьте задачу в crontab -e:

*/15 * * * * /scripts/task_wrapper.sh

Это будет запускать задачу каждые 15 минут. При успехе будет отправлен ping, при провале — другой ping, вызывающий алерт.

3. Настройка алертов

В панели Monitoring SaaS настройте задачу как "Cron monitor". Укажите интервал запуска, и сервис сам определит, если пинг не пришел вовремя или пришел сигнал ошибки.

4. Безопасность

  • Скрывайте ключи и токены через переменные окружения
  • Старайтесь логировать ошибки, чтобы видеть причины неудач

5. Альтернатива: systemd и retry

Если вы не используете cron, можно запускать задачи через systemd с флагами Restart=on-failure. Такой подход тоже совместим с мониторингом — просто добавьте curl-пинг в ExecStartPost.

Вывод

Мониторинг cron-задач с retry — важный шаг к надежной системе. Лучше узнать, что задача не сработала, чем гадать потом, где потерялись данные.

Настроить мониторинг