Сторож смотрит на результат, а не на запуск
Скрипт может тихо перестать работать, и крон об этом не скажет. Проверяйте, что появился свежий результат.
Ночной бэкап запускается кроном. Однажды у скрипта пропадает право на запуск: крон получает «Permission denied», вывод уходит в никуда, и бэкапов нет. Никто не узнает об этом, пока бэкап не понадобится.
Проверять код возврата скрипта бесполезно - скрипт вообще не запускался. Проверять нужно результат: есть ли в хранилище свежий файл.
#!/usr/bin/env bash
# Сторож: тревога, если свежему дампу в бакете больше 26 часов.
set -euo pipefail
latest=$(s3cmd ls s3://backups/ | sort | tail -1 | awk '{print $1" "$2}')
if [[ -z "$latest" ]]; then
msg="Бэкапов в бакете нет совсем"
else
age_h=$(( ($(date +%s) - $(date -d "$latest" +%s)) / 3600 ))
(( age_h > 26 )) && msg="Бэкап не обновлялся: $age_h ч" || msg=""
fi
if [[ -n "$msg" ]]; then
curl -fsS -X POST "$ALERT_URL" --data-urlencode "text=$msg"
fi
26 часов, а не 24 - чтобы долгий дамп или сдвиг расписания не будили зря.
Тот же принцип годится для всего, что работает по расписанию: выгрузки, синки, отчеты. Сторож спрашивает не «запустилось ли», а «есть ли свежее».