Что такое systemd timers и как заменить ими cron для планирования задач
cron
долгие годы оставался стандартным инструментом планирования задач в Linux: простой синтаксис, один файл crontab — и готово. Но с появлением systemd в большинстве современных дистрибутивов появился альтернативный (и во многом более гибкий) механизм — systemd timers. Он тесно интегрирован с системой сервисов, поддерживает более гибкие расписания, удобный логгинг и упрощённый контроль за выполнением заданий.
Почему стоит посмотреть в сторону systemd timers
- Интеграция с systemd: таймеры запускают обычные systemd-сервисы, значит можно использовать все возможности — зависимости, ограничения по ресурсам, перезапуски.
- Гибкость расписаний: кроме привычного «каждый час» есть возможность запускать по событиям (загрузка системы, простой) и задавать интервалы в человекочитаемом формате.
- Удобный журнал: результаты работы попадают в
journalctl
, не нужно настраивать отдельный вывод логов. - Управление стандартными командами systemctl: запуск, остановка, проверка статуса — те же привычные команды.
Структура: два файла
Для планирования задачи нужны два юнита:
- service-unit — описывает, что именно выполняется.
- timer-unit — описывает, когда выполнять.
Пример: хотим запускать бэкап-скрипт /usr/local/bin/backup.sh
каждый день в 2:30.
1. Service unit
Создаём файл /etc/systemd/system/backup.service
:
[Unit]
Description=Nightly backup
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
Type=oneshot
говорит systemd, что сервис выполняется один раз и завершается.
2. Timer unit
Создаём файл /etc/systemd/system/backup.timer
:
[Unit]
Description=Run nightly backup at 2:30
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
[Install]
WantedBy=timers.target
Ключевые опции:
- OnCalendar — расписание.
- Формат:
ГГГГ-ММ-ДД ЧЧ:ММ:СС
, можно использовать*
для шаблонов. - Примеры:
OnCalendar=hourly
— каждый час.OnCalendar=Mon *-*-* 10:00
— по понедельникам в 10:00.OnCalendar=*:0/15
— каждые 15 минут.
- Формат:
- Persistent=true — если сервер был выключен в момент срабатывания, задача выполнится при следующей загрузке.
Запуск и управление
Перечитываем юниты и включаем таймер:
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
Проверить статус:
systemctl list-timers
Увидите список всех активных таймеров и время до следующего запуска.
Посмотреть логи выполнения:
journalctl -u backup.service
Альтернативы cron-синтаксису
OnCalendar
поддерживает короткие ключевые слова:
hourly
,daily
,weekly
,monthly
,yearly
*:0/10
— каждые 10 минутMon..Fri 09:00
— в будние дни в 9:00
Это заметно удобнее и читабельнее классического crontab.
Дополнительные возможности
- Запуск по загрузке системы:
[Timer]
OnBootSec=10min
— запустить через 10 минут после старта.
- Интервальный режим:
OnUnitActiveSec=1h
— выполнять через час после предыдущего успешного запуска.
- Зависимости: можно указать, что таймер ждёт готовности сети (
After=network.target
) или запускается только при наличии определённых условий.
Преимущества над cron
Возможность | cron | systemd timers |
---|---|---|
Человекочитаемые интервалы (5min , hourly ) | – | ✅ |
Логи в journalctl | – | ✅ |
Зависимости от сервисов | – | ✅ |
Автоматический запуск пропущенных задач (Persistent) | – | ✅ |
Единый интерфейс управления (systemctl) | – | ✅ |
Советы по миграции
- Для старых скриптов можно просто обернуть их в systemd-сервис без изменений.
- Если cron уже настроен и работает — нет необходимости срочно переходить. Но для новых проектов timers почти всегда удобнее.
- Следите, чтобы скрипты корректно завершались с кодом
0
: systemd будет считать задачу упавшей при любом ненулевом коде выхода.
Итог
systemd timers
— это современная, более гибкая и управляемая замена cron.
Они не только упрощают расписание задач, но и позволяют использовать весь функционал systemd: логи, зависимости, перезапуски. Если вы уже работаете с современными дистрибутивами Linux (Ubuntu, Debian, CentOS, Fedora), имеет смысл делать ставку на timers для всех новых автоматических заданий.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний