Проблема cron в том, что при сбое ничего не происходит. Ни одна страница не падает, ошибка не показывается; бэкапа просто нет, когда он нужен.
Паттерн heartbeat
Дайте каждой задаче уникальный URL. Задача вызывает его при успешном завершении. Монитор ожидает вызов каждые N часов; если он опаздывает, вы получаете оповещение.
Cron
0 3 * * * /usr/local/bin/backup.sh && curl -fsS -m 10 https://hb.uptimepush.com/p/TOKENТаймеры systemd
Добавьте ExecStartPost=/usr/bin/curl -fsS https://hb.uptimepush.com/p/TOKEN в service-юнит.
Kubernetes CronJob
Добавьте вызов curl к команде контейнера через &&, чтобы он выполнялся только при успехе.
GitHub Actions
Добавьте финальный шаг, который вызывает URL через curl, а токен храните в секретах.
Льготный период
Задайте льготный период чуть длиннее самого долгого нормального выполнения задачи, чтобы медленная ночь не поднимала вас по тревоге.