Данная статья применима к
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8)
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7)
- Astra Linux Special Edition РУСБ.10152-02 (очередное обновление 4.7)
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
- Astra Linux Special Edition РУСБ.10015-16 исп. 1 и исп. 2
- Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.5)
- Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)
- Astra Linux Common Edition 2.12
Аннотация
В настоящей статье описывается работа с таймерами systemd — специальными службы systemd, управляющими запуском других юнитов systemd или программ.
Термины
- Cron
Юнит (— специально оформленный файл конфигурацииunit)Systemd. Каждый юнит отвечает за определенную функциональность:- службу (
*.service); - точку монтирования (
*.mount); - устройство (
*.device); - файл подкачки (
*.swap); - сокет (
*.socket); - таймер (
*.timer); - и т. д.
- службу (
Общие особенности юнитов
- Юниты поддерживают выполнение фиксированного набора команд
systemctl(start, stop, reload, restartи т.д.). - Юниты могут запускаться как от имени суперпользователя (общесистемные юниты), так и от имени непривилегированных пользователей (пользовательские юниты).
- По умолчанию пользовательские юниты существуют только в пределах пользовательских сессий, в которой они созданы, если не разрешена их работа вне пользовательской сессии. Разрешить работу пользовательских приложений вне пользовательских
сессий можно командами:
- для текущего пользователя:loginctl enable-linger $USER
- для других пользователей:sudo loginctl enable-linger <имя_пользователя>
- для текущего пользователя:
- Для работы с общесистемными юнитами требуются права администратора (используется sudo). Работа с пользовательскими юнитами выполняется с указанием опции --user команды systemctl от имени непривилегированного пользователя .
Служба cron
Таймеры systemd
Таймеры systemd различаются:
- по принципу запуска:
systemdне связаны с RTOS (real-time operating system)
- постоянные таймеры;
- временные таймеры:
- временные пользовательские таймеры существуют только в пределах пользовательских сессий, в которой они созданы, если не разрешена их работа вне пользовательской сессии.
- временные общесистемные таймеры существуют до перезагрузки ОС.
Различия таймеров и заданий cron
Создание таймеров
По умолчанию юниты постоянных системных таймеров располагаются в каталоге
/etc/systemd/system. Юниты системных временных таймеров хранятся в каталоге /run/systemd/transient, пользовательских временных таймеров — в каталоге /run/user/<числовой_идентификатор_пользователя>/systemd/transient. Числовой идентификатор пользователя можно получить командой:
Юнит таймера в обязательном порядке содержит ссылку на юнит службы
Общая структура юнита
[Unit] # Имя и описание службы Description=this is a test example of the service # Тип службы, указан oneshot, без порождения подпроцессов для упрощения взаимодействия с таймерами Type=oneshot [Service] # Перезапуск при сбое, необязательный параметр Restart=on-failure # Пример выполняемой команды ExecStart=/usr/local/bin/<имя файла или сценария>
Где:
Example.service
- Description
- ExecStart имя исполняемого файла, команды для командной строки, другой службы или сценария.
Общая справка доступна по команде man systemd units. Справка по юнитам служб и параметрам man systemd.service
Юнит таймера реального времени
В юните таймера должно быть указано имя юнита, которым управляет таймер. Unit=<имя_юнита_запускаемой_службы>.service. При этом допускается указание зарезервированных системных служб, перечисленных в
[Unit] # Имя и краткое описание таймера Description= [Timer] # Пример для запуска в каждый вечер пятницы OnCalendar= Fri *-*-* 18:00:00 # Здесь указывается имя юнита службы Unit=Example.service # Необязательные параметры Persistent=true AccuracySec=1h WakeSystem=30s # Необязательная для таймеров секция [Install] WantedBy=timers.target
Где:
- Unit Следует различать секцию
[Unit]определяющую параметры юнита таймера и параметрUnit, определяющий юнит, которым будет управлять таймер. - OnCalendar
UnitДопускается:OnCalendar=ДеньНедели Год-Месяц-День Час:Минута:Секунда
- пропускать неиспользуемые указания времени;
- указывать символ * в значении "каждый";
- для указания интервалов использовать две точки;
- для перечислений использовать запятые;
- для указания отсчёта от окончания периода использовать символ ~ вместо символа -.
Подробная справка о формате времени доступна по команде man 7 systemd.time.
Примеры значений параметра:
Для таймеров реального времени допускается указание нескольких параметров OnCalendar с разными интервалами времени и моментами срабатывания
- Persistent
false. - AccuracySec
- WakeSystem
- WantedBy
timers.target.
Перечень целевых состояний доступен по команде:
systemctl list-unit-files --type=targetСправка по настройке таймеров доступна по команде man systemd.timer
Юнит монотонного таймера
В юнитах монотонных таймеров указывается событие, от которого начинается отсчет времени срабатывания таймера. Перечень возможных параметров, задающих событие:
- OnBootSec — можно считать, что отсчет времени ведется с момента начала отсчета времени ядром. Контролируемый юнит выполняется однократно. Если при создании таймера указанное время прошло — то контролируемый юнит выполняется немедленно.
- OnStartupSec — отсчет с момента запуска службы systemd. Для системных таймеров параметр близок к параметру OnBootSec, так как системная служба контроля таймеров при загрузке системы стартует как можно раньше. Для пользовательских таймеров отсчет ведется от момента запуска пользовательской службы контроля таймеров, которая запускается при первом входе пользователя. Контролируемый юнит выполняется однократно. Если при создании таймера указанное время прошло — то контролируемый юнит выполняется немедленно.
- OnActiveSec — отсчет от момента активации таймера.
- OnUnitActiveSec — отсчет от старта контролируемого юнита. Для начала отсчета юнит должен быть запущен принудительно.
- OnUnitInactiveSec — отсчет от завершения работы отслеживаемого юнита. Для начала отсчета юнит должен быть запущен принудительно.
- OnClockChange, OnTimezoneChange — при значении
trueсобытием считается изменение показаний системных часов реального времени (CLOCK_REALTIME) относительно показаний монотонных часов (CLOCK_MONOTONIC) или изменение временной зоны.
Перечень значений параметра <интервал> задается указанием временного промежутка (15m — 15 минут, 1h ) подробнее см. man systemd.time
Пример юнита монотонного таймера:
[Unit] # Имя и краткое описание таймера Description= [Timer] # Формат <Событие>=<интервал>. В указанном примере таймер сработает через 50 минут после собственного запуска OnActiveSec=50minutes # Здесь указывается имя юнита службы Unit=Example.service # Необязательные параметры Persistent=true AccuracySec=1h WakeSystem=30s # Необязательная для таймеров секция [Install] WantedBy=timers.target
Запуск и отладка таймера
Перед запуском таймера необходимо:
- Перезагрузить конфигурацию служб
systemd:sudo systemctl daemon-reload - Проверить юниты на наличие синтаксических ошибок:
systemd-analyze verify <имя_юнита>.timer # или .service
- Запустить таймер:
sudo systemctl start<имя_таймера>.timer
Временные таймеры
Временные таймеры управляют выполнением заданных команд. Такие таймеры создаются с помощью команды systemd-run.
sudo systemd-run --<событие>="время" --unit="<название_таймера>" <команда>
При выполнении команды автоматически создаются:
- юнит службы
<название_таймера>.service; - юнит таймера
<название_таймера>.timer.
Опции команды:
--<
событие
>
— одно из событий срабатывания таймера. Используются аналоги событий, задаваемых параметрами постоянных таймеров:
-
--on-boot—OnBootSec;
--on-activeOnActiveSec;--on-startup—OnStartupSec;--on-unit-active—OnUnitActiveSec;--on-unit-inactive—OnUnitInactiveSec;--on-calendar—OnCalendar.
Пример:
Принудительный останов временного таймера:
systemctl --user stop run-r81fc2842fa884a639d020dea5faabb9d.timer Управление таймерами
- получить список всех системных таймеров, определенных в системе:
systemctl list-timers --all - получить список активных системных таймеров:
systemctl list-timers - получить информацию о статусе конкретного системного таймера:
systemctl status <имя_таймера>.timerуказание
systemctl status *timerвыведет информацию обо всех таймерах, определенных в системе.
Для получения информации и пользовательских таймерах следует использовать опцию --user.
Пуск, автозапуск, перезапуск, останов, отключение аналогичны командам systemctl для служб. Справка доступна по команде man systemctl, краткая по systemctl -h
Просмотр журналов юнитов
Посмотреть записи журнала конкретного юнита:
sudo journalctl -b -u <имя_юнита> # .service или .timer, параметр -b ограничивает вывод записей текущей загрузкойЧтобы ограничить вывод записей определенным интервалом, используется параметры -S и -U (от и до), пример:
sudo journalctl -S "2024-11-03 07:00:00" -U "2024-11-07 07:15:00" -u anacron.timer # имя юнита для примера
Anacron это вспомогательный инструмент cron для запуска пропущенных cron во время отключения компьютера заданий.
Следует различать параметры -u (юнит) и -U (до)
или конкретным интервалом (пример - день назад):
sudo journalctl -S -1d -u anacron.timerСправка доступна по команде man , краткая справка по параметрам - journalctl
journalctl -h
Начиная с очередного обновления 1.7 в Astra Linux Special Edition просмотр журналов юнитов возможен из графического интерфейса через Журнал аудита.