systemd timers в Linux
В предыдущих материалах мы разобрали два классических способа запуска задач по расписанию:
| |
Но в современных Linux-системах на базе systemd есть ещё один механизм:
| |
Systemd timer позволяет запускать сервисы по времени или через определённые интервалы и управлять ими привычными инструментами systemd.
В этой статье разберём:
- что такое systemd timer;
- как связаны
.timerи.service; - как посмотреть существующие timers;
- как создать собственный timer;
- как работает
OnCalendar; - что такое
OnBootSecиOnUnitActiveSec; - зачем нужен
Persistent=true; - как проверять расписание;
- как смотреть логи выполнения;
- как запускать одноразовые timers через
systemd-run; - чем systemd timers отличаются от cron.
Что такое systemd timer
Systemd timer — это специальный unit-файл systemd, который запускает другой unit по расписанию.
Чаще всего timer запускает соответствующий .service.
Например:
| |
То есть timer отвечает за вопрос:
Когда запускать?
А service отвечает:
Что запускать?
Это важное отличие от cron, где расписание и команда обычно записываются одной строкой.
Как связаны .timer и .service
По умолчанию systemd связывает timer и service с одинаковым именем.
Например:
| |
будет запускать:
| |
Поэтому обычно создаётся пара файлов:
| |
Схема получается такой:
| |
При необходимости timer может запускать unit с другим именем, но для начала удобнее придерживаться одинаковых названий.
Как посмотреть существующие timers
Systemd уже использует timers для различных системных задач.
Посмотреть активные таймеры можно командой:
| |
Пример вывода:
| |
Здесь можно увидеть:
| |
Чтобы показать в том числе неактивные timer units:
| |
Это одна из самых полезных команд при работе с systemd timers.
Создаём первый systemd service
Сначала создадим сервис.
Например:
| |
Содержимое:
| |
Здесь:
| |
означает, что сервис выполняет одну задачу и завершается.
А:
| |
указывает команду или скрипт.
Создаём тестовый скрипт
Например:
| |
Добавим:
| |
Дадим права:
| |
Проверим вручную:
| |
Посмотрим результат:
| |
Если появилась строка с текущей датой, скрипт работает.
Проверяем service вручную
До создания timer полезно убедиться, что сам сервис запускается.
Обновим конфигурацию systemd:
| |
Запустим сервис:
| |
Проверим:
| |
И посмотрим наш лог:
| |
Если service работает вручную, можно переходить к timer.
Создаём .timer
Теперь создадим:
| |
Например:
| |
Теперь у нас есть два файла:
| |
Timer будет запускать service.
OnCalendar
OnCalendar задаёт календарное расписание.
Например:
| |
означает запуск каждый день.
Можно использовать:
| |
или:
| |
Но можно указывать и конкретное расписание.
Например:
| |
Это запуск каждый день в 02:00.
Каждый день в 09:30
| |
По будням
Например:
| |
Timer будет запускаться с понедельника по пятницу в 09:00.
Как проверить выражение OnCalendar
Одна из очень удобных возможностей systemd:
| |
Например:
| |
Команда покажет, как systemd понимает расписание и когда наступит следующий запуск.
Ещё пример:
| |
Это намного удобнее, чем гадать, правильно ли написано выражение.
Запускаем timer
После создания файлов:
| |
Теперь включим timer:
| |
Здесь:
| |
Проверяем:
| |
Проверяем timer в списке
| |
Ищем:
| |
Можно сразу отфильтровать:
| |
Теперь мы можем увидеть время следующего запуска.
Как остановить timer
Остановить:
| |
Отключить автозапуск:
| |
Сразу остановить и отключить:
| |
Persistent=true
Одна из полезных возможностей календарных systemd timers:
| |
Представим timer:
| |
который должен выполняться каждый день в 02:00.
Но компьютер в это время был выключен.
При обычном расписании запуск будет пропущен.
С:
| |
systemd запоминает предыдущие срабатывания timer.
Если во время простоя системы должен был произойти запуск, после следующей активации timer systemd может выполнить пропущенную задачу.
Это особенно удобно для:
- ноутбуков;
- рабочих станций;
- серверов, которые периодически выключаются;
- резервного копирования;
- задач обслуживания.
Важно: Persistent= относится к timers, использующим OnCalendar=.
OnBootSec
Не все timers привязаны к часам и календарю.
Можно запускать задачу через определённое время после загрузки системы.
Например:
| |
Это означает:
| |
OnUnitActiveSec
Можно запускать задачу через определённый интервал после предыдущего запуска.
Например:
| |
Логика:
| |
Так можно создавать периодические задачи без календарного расписания.
Calendar timers и monotonic timers
У systemd timers есть два основных подхода к расписанию.
Календарное время
Используем:
| |
Например:
| |
Это означает:
каждый день в два часа ночи.
Интервал относительно события
Используем:
| |
Например:
| |
означает:
через десять минут после загрузки.
А:
| |
означает:
через час после предыдущей активации unit.
Где смотреть логи
Одна из сильных сторон systemd timers — интеграция с journal.
Сам timer:
| |
Сервис:
| |
Последние события:
| |
Следить в реальном времени:
| |
Это удобно при поиске ошибок.
Проверяем состояние service
| |
Проверяем timer:
| |
И список timers:
| |
Получается удобный набор диагностики:
| |
Если изменили .timer или .service
После редактирования unit-файлов нужно сообщить systemd об изменениях:
| |
После этого можно перезапустить timer:
| |
Это важный шаг, о котором часто забывают.
Одноразовая задача через systemd-run
Необязательно всегда вручную создавать .service и .timer.
Для временных задач есть:
| |
Например:
| |
Systemd создаст временные timer и service units.
Посмотреть их можно через:
| |
Запуск по календарю через systemd-run
Можно использовать:
| |
Таким образом systemd-run позволяет быстро создать задачу по расписанию без постоянных unit-файлов.
Это в некотором смысле похоже на использование at, но уже через инфраструктуру systemd.
Cron или systemd timers
Один из главных вопросов:
Нужно ли теперь отказываться от cron?
Нет.
У обоих вариантов есть свои преимущества.
Cron
Простой пример:
| |
Плюсы:
- простой;
- привычный;
- короткая запись;
- работает на огромном количестве Unix/Linux-систем;
- отлично подходит для небольших периодических задач.
Systemd timer
Здесь обычно есть:
| |
Плюсы:
- интеграция с
systemctl; - логи через
journalctl; - зависимости между units;
- управление окружением и пользователем через service unit;
Persistent=true;- календарные и относительные timers;
- единая система управления сервисами и задачами.
Что выбрать
Для простой задачи:
| |
cron может быть самым простым решением.
Если задача уже является частью инфраструктуры systemd, нужны зависимости, журналирование, контроль состояния и более гибкое управление — systemd timer часто оказывается удобнее.
Поэтому правильнее думать не:
systemd timers заменили cron.
А:
это два разных инструмента для похожих задач.
Cron, at и systemd timers
Теперь наш блок планирования задач можно собрать полностью.
cron
| |
Например:
| |
at
| |
Например:
| |
systemd timers
| |
Например:
| |
Практический пример целиком
Создаём service:
| |
| |
Создаём timer:
| |
| |
Обновляем systemd:
| |
Включаем:
| |
Проверяем:
| |
Смотрим состояние:
| |
Логи:
| |
Готово.
Краткая шпаргалка systemd timers
Посмотреть timers:
| |
Все timers:
| |
Проверить timer:
| |
Запустить:
| |
Включить и запустить:
| |
Остановить:
| |
Перечитать unit-файлы:
| |
Проверить календарное выражение:
| |
Посмотреть логи:
| |
Создать временный timer:
| |
Что важно знать для LPIC-1
Systemd timers входят в тему LPIC-1 Objective 107.2 — автоматизация административных задач по расписанию.
В рамках этой темы важно понимать:
| |
Для systemd timers полезно уметь:
- понимать назначение
.timerunit; - понимать связь
.timerи.service; - посмотреть timers;
- запустить и включить timer;
- понимать принцип календарного и интервального расписания.
Что стоит запомнить
Самая важная схема:
| |
Основные команды:
| |
И основные параметры:
| |
Не нужно запоминать весь синтаксис systemd timers.
Гораздо важнее понимать принцип и знать, где проверить расписание и состояние задачи.
Презентация и видео по теме
➡️Rutube
➡️VK
➡️YouTube
Документация
systemd.timer — официальная документация
Timer units,OnCalendar,OnBootSec,OnUnitActiveSec,Persistentи другие параметры расписания.systemctl — официальная документация
Управление.timerи.serviceunits,systemctl list-timers,start,stop,enable,status.systemd.time — синтаксис времени
Форматы времени и календарных выражений, используемых вOnCalendar.systemd-analyze — официальная документация
Проверка и разбор конфигурации systemd. Командаsystemd-analyze calendarпомогает проверить выражениеOnCalendarи увидеть время следующего запуска.systemd-run — официальная документация
Создание временных service и timer units без ручного создания файлов.LPIC-1 Exam Objectives — Objective 107.2
Требования LPIC-1 по автоматизации задач:cron,atи systemd timers.