Healthchecks: замечать пропущенные задания cron
Добавлено 2026-10-11. Нужны Bash, curl и отдельная проверка в Healthchecks.
Проблема
Задание резервного копирования перестало запускаться. Ошибок в логах нет: процесс вообще не стартовал. Обычный мониторинг CPU этого не замечает.
Решение
Healthchecks ожидает сигнал по расписанию и сообщает об опоздании. Сигналы /start, обычный ping и /fail различают запуск, успех и ошибку. У проверки задать расписание, часовой пояс и Grace Time, превышающий нормальную длительность задания.
Монитор должен находиться вне отказного домена VPS: при падении общего хоста локальный Healthchecks также перестанет работать. Можно использовать отдельный сервер или размещённый сервис.
Пример
Обёртка monitored-job.sh получает команду с аргументами. Переменную HC_PING_URL взять из созданной проверки, хранить как секрет задания; не включать трассировку set -x. URL здесь без завершающего / и параметров запроса.
#!/usr/bin/env bash
set -uo pipefail
: "${HC_PING_URL:?Задайте ping URL проверки}"
if (( $# == 0 )); then
printf 'Нужна команда задания\n' >&2
exit 64
fi
signal_check() {
if ! curl --fail --silent --output /dev/null \
--connect-timeout 3 --max-time 10 --retry 2 \
"${HC_PING_URL}${1}"; then
printf 'Не удалось отправить сигнал мониторинга\n' >&2
fi
}
signal_check /start
if "$@"; then
job_status=0
signal_check ''
else
job_status=$?
signal_check /fail
fi
exit "$job_status"
Вызов из существующего задания, после настройки переменной окружения:
/usr/local/bin/monitored-job.sh /usr/local/bin/backup-devops-kb.sh
Скрипт бэкапа должен сам возвращать ненулевой код при ошибке. Сбой отправки ping не отменяет бэкап и не подменяет его код завершения. О зависании или невозможности отправить сигнал монитор узнает по таймауту. Для параллельных запусков нужны отдельные проверки или идентификаторы запусков (rid); пример рассчитан на одно задание без перекрытий.
Когда применять
Бэкапы, очистка временных данных, синхронизация, периодические отчёты. Проверка завершения бэкапа дополняет учение восстановления.
Источник
Как применить у себя
- Настроить получателя уведомлений и время ожидания.
- На тестовой проверке выполнить обёртку с
true, затем сfalse. - Пропустить один тестовый запуск и дождаться уведомления; проверить восстановление состояния следующим успешным ping.
- Отметить «Изучено», когда получены уведомления и об ошибке, и о пропуске.