Введение / Зачем это нужно
Systemd-timers — это современная альтернатива cron, которая использует тот же менеджер системных служб. Таймеры позволяют запускать скрипты, сервисы или другие unit-файлы по точному расписанию или на основе событий. По сравнению с cron они предлагают более гибкие триггеры (например, запуск по таймеру после активации другой службы) и лучше интегрированы с системой.
После выполнения этого руководства вы сможете создавать как простые ежедневные задачи, так и сложные, основанные на событиях таймеры, и отладить их с помощью стандартных инструментов systemd.
Требования / Подготовка
- Система с systemd (любой современный дистрибутив Linux: Ubuntu, Debian, Fedora, openSUSE и т.д.).
- Права на запись в
~/.config/systemd/user/(для пользовательских таймеров) или/etc/systemd/system/(для системных таймеров). - Базовое знание работы с консолью и редактором текста (например,
nanoилиvim). - Пример скрипта, который вы хотите запускать по расписанию (например,
#!/bin/bashфайл).
Пошаговая инструкция
Шаг 1: Создайте unit-файл для скрипта
Сначала определите службу, которая будет выполнять вашу задачу. Пример unit-файла для скрипта /home/user/scripts/backup.sh:
# /etc/systemd/system/backup.service
[Unit]
Description=Backup script
[Service]
Type=oneshot
ExecStart=/home/user/scripts/backup.sh
User=user
Шаг 2: Создайте таймер-файл
Теперь создайте таймер, который будет запускать службу. Пример таймера, который запускается каждый день в 02:00:
# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup daily at 02:00
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
Шаг 3: Включите и запустите таймер
Перезагрузите daemon, чтобы systemd обнаружил новые unit-файлы, затем включите и запустите таймер:
sudo systemctl daemon-reload
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
Шаг 4: Проверьте состояние таймера
Убедитесь, что таймер активен и запланирован:
# Проверка статуса таймера
sudo systemctl status backup.timer
# Список всех таймеров
sudo systemctl list-timers --all
Если таймер отображается как активен (включен), он будет запускать службу по расписанию.
Шаг 5: Настройте периодичность с помощью календаря
Вы можете изменить расписание, отредтировав OnCalendar. Примеры:
- Каждый час:
OnCalendar=*:0/60 - Каждый понедельник в 9 утра:
OnCalendar=Mon *-*-* 09:00:00 - Каждый день в 8:00 и 20:00:
OnCalendar=*-*-* 08:00:00,20:00:00
После изменения отредактируйте таймер, выполните systemctl daemon-reload и перезапустите таймер:
sudo systemctl restart backup.timer
Шаг 6: Удалите таймер (если нужно)
Если таймер больше не нужен:
sudo systemctl disable backup.timer
sudo systemctl stop backup.timer
sudo rm /etc/systemd/system/backup.timer
sudo systemctl daemon-reload
Проверка результата
Чтобы убедиться, что таймер работает, проверьте лог службы после её запуска:
journalctl -u backup.service -f
Вы также можете просмотреть журнал таймеров:
journalctl -u backup.timer -f
Если в логах отображается Triggered Reason: Timer was activated, таймер успешно запустил службу.
Возможные проблемы
⚠️ Важно: Убедитесь, что
ExecStartв unit-файле указывает на существующий и исполняемый скрипт. Если скрипт не найден, таймер зарегистрирует ошибку, но не отобразит её в статусе.
💡 Совет: Для отладки сложных расписаний используйте
systemd-analyze calendarдля проверки синтаксиса:
systemd-analyze calendar "*-*-* 02:00:00"
Если вы используете пользовательские таймеры (в ~/.config/systemd/user/), убедитесь, что вы запустили systemd --user и включили таймер с помощью systemctl --user.
⚠️ Важно: Таймеры, настроенные с
Persistent=true, будут запускаться после перезагрузки системы, в то время какPersistent=false— нет. Выберите параметр в зависимости от того, нужно ли вам запускать задачу после перезагрузки.