Systemd timer — юнит типа .timer в systemd, запускающий соответствующий .service-юнит по расписанию. Это современная альтернатива cron с интеграцией в экосистему systemd: логи доступны через journalctl, статус — через systemctl, управление зависимостями — стандартными механизмами systemd.
Как работает
Пара файлов: backup.service (что выполнять) и backup.timer (когда).
/etc/systemd/system/backup.timer:
[Unit]
Description=Daily backup timer
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
Директива Persistent=true означает: если система была выключена в момент плановой задачи, при следующем включении задача будет выполнена немедленно. Это отличие от cron, который пропускает задачу при простое системы.
Управление: systemctl enable --now backup.timer, systemctl list-timers — список всех таймеров и время следующего запуска.
История
Systemd timer появился в systemd версии 183 (2012 год). Первоначально systemd-timers не имели часового пояса и RealTime-директив — они добавлялись постепенно. В современных версиях systemd (247+, Ubuntu 20.04) поддерживается OnCalendar с полным синтаксисом, включая временные зоны и точные временны́е выражения типа Mon..Fri 09:00.
Связь с хостингом
На VPS systemd timer заменяет cron для надёжных фоновых задач: резервные копии, очистка кэша, отчёты. Основное преимущество: journalctl -u backup.service показывает историю всех запусков с выводом команды — в cron логи приходилось отдельно перенаправлять в файл.
Синтаксис systemd-timer
Два файла: myapp.timer (расписание) + myapp.service (команда). В .timer: [Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true. Persistent=true — запускает пропущенные задачи при старте системы (аналог cron @reboot).
Преимущества перед cron
Интеграция с systemd journal: лог каждого запуска через journalctl -u myapp.service. Зависимости между задачами. OnBootSec — запуск через N секунд после загрузки. Изоляция ресурсов: CPUQuota, MemoryMax. systemctl list-timers — все таймеры и следующий запуск.
Примеры использования
Ночные бэкапы: OnCalendar=*-*-* 03:00:00. Certbot renew: OnCalendar=*-*-* 12:00:00 (Certbot устанавливает этот таймер автоматически). Очистка логов, ротация файлов, периодическая синхронизация данных.
Мониторинг systemd-timer
systemctl list-timers --all — все таймеры: последний запуск, следующий. Статус конкретного: systemctl status backup.timer. Если LAST TRIGGER давно: проверить journalctl -u backup.service. Uptime Robot Heartbeat monitor + curl в сервисе — внешний мониторинг выполнения задач.
Отладка таймеров
Ручной запуск сервиса таймера: systemctl start backup.service (без ожидания таймера). Проверка ошибок: journalctl -u backup.service -n 50. Если OnCalendar не срабатывает: проверить синтаксис systemd-analyze calendar "*-*-* 02:00:00". Persistent=true гарантирует запуск пропущенных задач.