Документация

systemd timer

Отчёт об успехе и о падении средствами самого systemd.

У systemd есть то, чего нет у cron: ExecStopPost знает, чем кончился запуск. Это позволяет отчитываться и об успехе, и о падении, не трогая сам скрипт.

backup.service
[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 обязателен: без него недоступность сети превратит рабочую задачу в упавшую. Мониторинг не должен ломать то, что он мониторит.

backup.timer
[Unit]
Description=Ночной бэкап по расписанию

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target
systemd timer · Tickwatch