Все материалы

Фоновые задачи

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

Подключаем сигнал после успешной команды, согласуем cron-расписание и проверяем пропуск и восстановление.

Команда Uptimely

Cron запускает команду по расписанию, но работающий сервер не доказывает, что команда успешно завершилась. Ошибка прав, пустое окружение или зависшая зависимость могут остановить ночную задачу, пока сайт продолжает отвечать. Мониторинг cron-задач через heartbeat помогает заметить отсутствие ожидаемого результата.

Что будем проверять

Задача должна присылать HTTP-сигнал только после выбранной точки успеха. Если сигнала нет в срок, сервис фиксирует пропуск. Это контроль выполнения, а не удалённый запуск задачи и не автоматическое исправление ошибки.

Создайте отдельный Heartbeat-монитор в Uptimely. Он доступен на Free в пределах лимитов тарифа. Скопируйте URL в секретную переменную HEARTBEAT_URL; не помещайте адрес в репозиторий или публичный crontab-пример.

Оберните задачу в Bash-скрипт

Сохраните обёртку, например в /opt/jobs/checked-job.sh. Путь к задаче замените своим.

#!/usr/bin/env bash set -euo pipefail : "${HEARTBEAT_URL:?Задайте URL из настроек монитора}" /opt/jobs/job.sh curl --fail --silent --show-error \ --connect-timeout 5 --max-time 15 "$HEARTBEAT_URL"

Ненулевой код job.sh остановит обёртку до отправки сигнала. Если задача скрывает собственные ошибки, сначала исправьте её контракт: мониторинг не может вывести успех работы из команды, которая всегда возвращает ноль. Для пайплайнов pipefail помогает обнаружить ошибку промежуточной команды.

HTTP-запрос ограничен по времени. Ошибка его доставки означает, что задача могла завершиться успешно, а сигнал — нет. Не повторяйте всю бизнес-операцию из-за ошибки curl; сначала выясните, какой шаг не выполнился.

Настройте расписание и окружение

Пример системного crontab для запуска раз в пять минут:

*/5 * * * * /usr/bin/bash /opt/jobs/checked-job.sh

Переменная из вашего интерактивного терминала не обязана существовать у cron. Настройте передачу секрета для пользователя задачи через используемый вами механизм запуска или закрытый конфигурационный файл. У файла должны быть права только для нужного пользователя. Не включайте set -x и не печатайте окружение в журнал.

Валидатор crontab проверит пять полей и покажет ближайшие запуски в UTC. Проверьте также фактический часовой пояс сервера.

В cron-режиме Heartbeat используется другое выражение — шесть полей с секундами, всегда в UTC:

0 */5 * * * *

Добавьте допустимую задержку, включающую время работы и доставки сигнала. Для ежедневного задания сопоставьте часовой пояс системного cron и UTC монитора. Подробнее — в руководстве по grace period.

Проверьте весь путь

На отдельном тестовом мониторе сначала отправьте сигнал и найдите его в истории. Настройте email, Telegram или вебхук. Затем пропустите один тестовый запуск и дождитесь записи о пропуске, инцидента и уведомления. Отправьте новый сигнал и проверьте восстановление. По окончании удалите только тестовый монитор.

Уведомление может прийти позже срока ожидания из-за фоновой обработки и настроенной задержки подтверждения инцидента. Не проверяйте отказ остановкой рабочего бэкапа или изменением production-инфраструктуры.

Если задача работает только вручную

Проверьте абсолютные пути, пользователя, рабочую директорию, права файлов, доступ к зависимостям и наличие секретной переменной у cron. Отдельно проверьте исходящий HTTPS и актуальность URL. Для двух независимых задач нужны два монитора: один успешный сигнал иначе может скрыть отказ другой задачи.

Полная инструкция с Bash, Python и диагностикой находится в документации Heartbeat. Для ночного резервного копирования пригодится пример PostgreSQL.