Проблема 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 — важный шаг к надежной системе. Лучше узнать, что задача не сработала, чем гадать потом, где потерялись данные.
Настроить мониторинг