Linux · systemd

Мониторинг systemd timer: запуск, ошибка и пропуск

Добавьте сигналы Tickwatch в oneshot service: начало, результат и контроль пропущенного timer. Пример service и timer с часовым поясом.

Free: 5 мониторов, Telegram и email.

Пример уведомления

● systemd-backup

Service сообщил об ошибке. Подробности: journalctl -u backup.service.

Открыть монитор

Демонстрационные данные. Вид и состав сообщения зависят от канала и типа события.

Когда это нужно

Активный timer не означает, что backup.service успешно создал копию. Ошибку можно увидеть в journalctl, но о ней легко узнать слишком поздно. Отправляйте результат service наружу и отдельно контролируйте время ожидаемого выполнения.

Как подключить

  1. 1

    Создайте монитор на 0 3 * * *, Europe/Moscow. Задайте запас на опоздание и максимальную длительность с учётом вашей задачи.

  2. 2

    Разделите пример на backup.service и backup.timer в /etc/systemd/system. Замените URL и ExecStart; используйте учётную запись с нужными для задачи правами.

  3. 3

    Перечитайте конфигурацию, включите timer и проверьте результат тестового service. Подключите канал уведомлений в Tickwatch.

Готовый пример

Нужны systemd, /bin/sh и curl по указанному пути. Это два отдельных unit-файла. Команда backup.sh должна исполняться и возвращать ненулевой код при ошибке. Префикс «-» у отправки сигналов не позволяет сбою мониторинга сорвать задачу. Не добавляйте RemainAfterExit=yes к периодическому oneshot.

backup.service + backup.timer
# /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.target
Запуск или настройка
sudo 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 не запускается вторым параллельным экземпляром. Контролируйте максимальную длительность и согласуйте интервал с длительностью работы.

Проверьте первый запуск, пока задача ещё работает

Создайте монитор, подставьте свой URL пинга и убедитесь, что приходят сигналы и уведомления.

Мониторинг systemd timer: запуск, ошибка и пропуск · Tickwatch