systemd timer
Отчёт об успехе и о падении средствами самого systemd.
У systemd есть то, чего нет у cron: ExecStopPost знает, чем кончился запуск. Это позволяет отчитываться и об успехе, и о падении, не трогая сам скрипт.
[Unit]
Description=Ночной бэкап
[Service]
Type=oneshot
Environment=PING=https://ping.tickwatch.dev/ВАШ-КЛЮЧ
ExecStartPre=-/usr/bin/curl -fsS -m 10 --retry 3 ${PING}/start
ExecStart=/usr/local/bin/backup.sh
ExecStopPost=-/bin/sh -c 'if [ "$SERVICE_RESULT" = success ]; then \
curl -fsS -m 10 --retry 3 "${PING}"; \
else \
journalctl -u backup.service -n 50 --no-pager | \
curl -fsS -m 10 --retry 3 --data-binary @- "${PING}/fail"; \
fi'Переменные SERVICE_RESULT и EXIT_STATUS подставляет сам systemd — отдельно вычислять результат не нужно.
Минус перед командой в ExecStartPre и ExecStopPost обязателен: без него недоступность сети превратит рабочую задачу в упавшую. Мониторинг не должен ломать то, что он мониторит.
[Unit]
Description=Ночной бэкап по расписанию
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target