Введение / Зачем это нужно
systemd timer — это современная альтернатива cron, которая позволяет планировать выполнение команд с точностью до секунд. Использование таймеров дает вам гибкость задавать сложные расписания, включать случайные задержки и получать подробную информацию о работе через journal. После прочтения этого руководства вы сможете создавать таймеры для резервного копирования, обновления системы, очистки логов или любых других периодических задач — без необходимости в дополнительных пакетах.
Требования / Подготовка
- Современная дистрибутива Linux с systemd (например, Ubuntu, Debian, Fedora, Arch).
- Права администратора (
sudo), если вы настраиваете системные таймеры, или учетная запись пользователя для пользовательских таймеров. - Текстовый редактор (
nano,vim,sed). - Базовое понимание unit-файлов systemd.
Шаг 1: Создание файла таймера
Создайте файл таймера в /etc/systemd/system/ (для системных таймеров) или в ~/.config/systemd/user/ (для пользовательских таймеров). Например, mytimer.timer:
[Unit]
Description=Пример таймера systemd
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
💡 Совет:
Persistent=trueгарантирует, что таймер отработает сразу после включения, если он был выключен.
После сохранения файла выполните:
systemctl daemon-reload
Шаг 2: Настройка расписания
Редактировать секцию [Timer], чтобы задать нужное расписание:
OnCalendar=*-*-* 03:00:00— ежедневно в 3 утра.OnBootSec=10min— выполнить через 10 минут после загрузки системы.RandomizedDelaySec=30— добавить случайную задержку до 30 секунд.
Сохраните изменения и выйдите из редактора.
Шаг 3: Активация и запуск таймера
Активируйте таймер, чтобы он запускался после перезагрузки, и запустите немедленно:
systemctl enable mytimer.timer
systemctl start mytimer.timer
systemctl status mytimer.timer
Статус active (auto-restart) означает, что таймер работает корректно.
Шаг 4: Проверка состояния таймера
Просмотрите запланированные запуски:
systemctl list-timers --all
Для отслеживания событий в реальном времени:
journalctl -u mytimer.timer -f
Эти логи показывают, когда таймер срабатывает и какую службу он запускает.
Шаг 5: Устранение распространенных проблем
| Симптом | Вероятная причина | Решение |
|---|---|---|
Failed to read unit file | Файл таймера отсутствует или имеет неправильное имя | Убедитесь, что файл находится в /etc/systemd/system/ и называется mytimer.timer |
Unit mytimer.timer could not be found | Неверный путь или опечатка в имени | Проверьте systemctl list-unit-files "*timer*" |
Таймер неактивен (inactive) | Не выполнены enable/start или ошибка в синтаксисе | Запустите systemd-analyze verify mytimer.timer для проверки синтаксиса, затем systemctl daemon-reload, systemctl enable и systemctl start |
| Сервис не выполняется | Неправильный пользователь/разрешения или сломанный service unit | Проверьте mytimer.service на корректность, настройте User= или Group=, если нужно, и выполните systemctl restart mytimer.service |
Permission denied при запуске | Таймер работает под неправильным пользователем | Измените User= в [Service] на пользователя с необходимыми правами или запустите сервис от имени root |
Проверка результата
Подождите до следующего запланированного времени (например, 2:00) или запустите таймер вручную:
systemctl start mytimer.timer
Проверьте журналы:
journalctl -u mytimer.timer -b
Найдите строку, где запускается связанная служба (mytimer.service). Если вы настроили выполнение команды (например, echo "done" > /tmp/done.txt), убедитесь, что файл создан или что вывод команды записан в лог.
Возможные проблемы
- Неправильный формат
OnCalendar– используйтеsystemd.time-спецификатор илиcron-аналог (* * * * *). - Отсутствие
WantedBy=timers.target– таймер не будет зарегистрирован системой. - Дублирующие таймеры – убедитесь, что не создано несколько таймеров с одинаковым
OnCalendar. - Сбой service unit – проверьте
mytimer.serviceна наличие синтаксических ошибок, прав и зависимостей.
Если таймер по-прежнему не работает, запустите systemd-analyze verify mytimer.timer и journalctl -u mytimer.timer -b для детальной диагностики.