Когда это нужно
Активный timer не означает, что backup.service успешно создал копию. Ошибку можно увидеть в journalctl, но о ней легко узнать слишком поздно. Отправляйте результат service наружу и отдельно контролируйте время ожидаемого выполнения.
Как подключить
- 1
Создайте монитор на 0 3 * * *, Europe/Moscow. Задайте запас на опоздание и максимальную длительность с учётом вашей задачи.
- 2
Разделите пример на backup.service и backup.timer в /etc/systemd/system. Замените URL и ExecStart; используйте учётную запись с нужными для задачи правами.
- 3
Перечитайте конфигурацию, включите timer и проверьте результат тестового service. Подключите канал уведомлений в Tickwatch.
Готовый пример
Нужны systemd, /bin/sh и curl по указанному пути. Это два отдельных unit-файла. Команда backup.sh должна исполняться и возвращать ненулевой код при ошибке. Префикс «-» у отправки сигналов не позволяет сбою мониторинга сорвать задачу. Не добавляйте RemainAfterExit=yes к периодическому oneshot.
# /etc/systemd/system/backup.service
[Unit]
Description=Nightly backup with Tickwatch
[Service]
Type=oneshot
Environment=PING=https://ping.tickwatch.dev/YOUR_PING_KEY
TimeoutStartSec=30min
ExecStartPre=-/bin/sh -c '/usr/bin/curl -fsS --max-time 5 -X POST "$$PING/start"'
ExecStart=/usr/local/sbin/backup.sh
ExecStopPost=-/bin/sh -c 'if [ "$$SERVICE_RESULT" = success ]; then /usr/bin/curl -fsS --max-time 5 -X POST "$$PING"; else /usr/bin/curl -fsS --max-time 5 -X POST "$$PING/fail"; fi'
# /etc/systemd/system/backup.timer
[Unit]
Description=Run the nightly backup
[Timer]
OnCalendar=*-*-* 03:00:00 Europe/Moscow
Persistent=true
[Install]
WantedBy=timers.targetsudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timerЧто проверить перед запуском
ExecStopPost отправляет результат и после ошибки запуска. Двойной знак $$ передаёт переменную SERVICE_RESULT оболочке, не подставляя её заранее в systemd.
Persistent=true запускает пропущенную работу после включения timer, но не доказывает создание всех пропущенных копий. Проверьте свежесть файлов отдельно.
Остановите тестовый timer на один интервал и проверьте уведомление. Если сервер выключен, отсутствие завершения обнаружит дедлайн.
Частые вопросы
Почему не только ExecStartPost?
Он не покрывает ошибку ExecStart. В примере результат проверяется в ExecStopPost, поэтому неуспешный запуск тоже отправляет /fail.
А если timer сработает во время выполнения?
Этот же unit не запускается вторым параллельным экземпляром. Контролируйте максимальную длительность и согласуйте интервал с длительностью работы.