Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.
Информация
titleДанная статья применима к
  • 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

Аннотация

Cron — системная служба, которая запускает в указанное время перечисленные для неё задания. Служба запускается один раз при загрузке системы. Редактирование списка заданий рекомендуется выполнять при помощи команды:

Command
sudo crontab -e

Справка по командам доступна в в man cron

Управление заданиями службы возможно из графического интерфейса через Планировщик задач.

Systemd — системная служба, которая обеспечивает параллельный запуск других служб в процессе загрузки ОС. Systemd оперирует специально оформленными файлами конфигурации— юнитами (unit). Каждый юнит отвечает за конкретную службу (*.service), точку монтирования (*.mount), устройство (*.device), файл подкачки (*.swap), сокет (*.socket) и т. д.  Юниты systemd имеют фиксированный набор параметров, оформленных в виде параметров команды systemctl (start, stop, reload, restart и т.д.).

Таймер systemd (далее просто таймер) файлы юнитов systemd, имя которых имеет расширение (*.timer); они позволяют контролировать файлы служб (*.service).

В зависимости от принципов запуска существуют два типа таймеров:

  • таймеры реального времени, запускаются с привязкой к системным часам. Аналогичны инструменту cron, но обладают более гибкими настройками периодов работы;
  • монотонные таймеры запускающиеся в назначенное время, прошедшее с определенной начальной точки. 

Различия таймеров и заданий cron

Основные причины для применения таймеров вместо заданий cron :

  • таймеры используют единую систему команд инструмента управления службами systemctl;
  • таймеры имеют встроенные функции для ведения журналов и отслеживания состояния выполнения;
    Информация

    Для каждого таймера создается отдельный файл журнала journalctl


  • таймеры могут инициировать выполнение задач на основе событий системы, например запуска или окончания работы службы, вызванной другим таймером, а не только по расписанию как cron;
  • приоритет выполнения таймеров выше, чем у заданий cron;
  • systemd предотвращает возникновение работающих юнитов-дублей;
  • задания cron выполняются последовательно, если заданиям cron назначен одинаковый интервал выполнениия первым выполнится требующее меньшего времени на выполнение. Таймеры могут работать совместно как службы.

Информация

Пользовательские юниты-таймеры будут запускаться только тогда, когда активен сеанс соответствующего пользователя

Создание таймеров

По умолчанию файлы с юнитами systemd, включая юниты с монотонными таймерами и таймерами реального времени распологаются в каталоге /etc/systemd/system. Файл с юнитом таймера (*.timer) содержит ссылку на файл с юнитом службы (*.service), которую он контролирует.

Systemd имеет несколько зарезервированных системных юнитов, перечень которых доступен по команде man systemd.special

Информация

Назначение занятых системных имён создаваемым юнитам нежелательно и приводит к ошибке выполнения создаваемого юнита

Общая структура юнитов служб:

Блок кода
title/etc/systemd/system/<Служба>Example.service
[Unit]
Description= # имя и описание службы
Type=oneshot # тип службы, указан oneshot, без порождения подпроцессов для упрощения взаимодействия с таймерами

[Service]
Restart=on-failure # перезапуск при сбое, необязательный параметр
ExecStart=/usr/local/bin/<имя файла или сценария> # примеры выполняемой команды

Где:

Example.service пример названия файла с юнитом службы .service

Обязательные параметры:


ExecStart имя исполняемого файла, команды для коммандной строки, другой службы или сценария.


Общая справка доступна по команде команде man systemd units. Справка по юнитам служб и параметрам man systemd.service

Управление юнитом службы через таймер

Для запуска юинта службы в файле с юнитом таймера (*.timer) необходимо указать параметр Unit=<имя юнита запускаемой службы>.service, при этом допускается указание системных служб, перечисленных в man systemd.special

Общая структура юнитов таймеров (таймер запускает юнит службы):

Блок кода
title/etc/systemd/system/<Таймер>.timer
[Unit]
Description= # имя и краткое описание таймера

[Timer]
# <СобытиеСобытие запуска таймера> - условиетаймера, припример которомдля начинаетсязапуска отсчёт таймера

# Ссылка на юнит 
Unit=<имя юнита запускаемой службы>.service # <=здесьв каждый вечер пятницы
OnCalendar= Fri *-*-* 18:00:00

# Здесь указывается имя юнита службыслужбы 
Unit=Example.service

# Необязательные параметры:

Persistent=true 
AccuracySec=1h
WakeSystem=30s

# Необязательная выполнить немедленно после старта системы, если предыдущий запуск был пропущен
# по умолчанию установлено false

AccuracySec=1h # точность выполнения таймера. 
# Параметр необходим для снижения нагрузки на ресурсы компьютера при одновременном запуске нескольких таймеров
# Таймеры будут запускаться в разные моменты времени в пределах указанного диапазона

WakeSystem=30s # интервал, через который будет осуществлен вывод ОС из режима ожидания (suspend) после окончания таймера

# Необязательная для таймеров секция
[Install]
WantedBy=timers.target
# WantedBy= — указывает на целевое состояние при котором запускается данный юнит. Целевое состояние определяется статусом загруженной ОСдля таймеров секция
[Install]
WantedBy=timers.target

Где:

  • Description краткое описание таймера, допускаются пробелы;
  • Unit обязательный параметр, имя юнита запускаемой службы, файла .service
  • Persistent указание запустить таймер немедленно после старта системы, если предыдущий запуск был пропущен, по умолчанию false
  • AccuracySec точность момента запуска таймера. Таймеры будут запускаться в разные моменты времени в пределах указанного диапазона, начиная с указанного времени старта.Необходим для снижения нагрузки на ресурсы компьютера при одновременном запуске нескольких таймеров;
  • WakeSystem  интервал, через который будет осуществлен вывод ОС из режима ожидания (suspend) после окончания отсчёта времени таймером;
  • WantedBy указывает на целевое состояние при котором запускается данный юнит. Целевое состояние определяется статусом загруженной ОС. Для таймеров по умолчанию задано значение timers.target

Перечень целевых состояний доступен по командеПеречень целевых состояний:

Command

systemctl list-unit-files --type=target

Справка по конфигурированию таймеров доступна по команде команде man systemd.timer

Событие запуска таймера

Таймеры реального времени

Блок кода
title/etc/systemd/system/<РеалВрТаймер>.timer
....
[Timer]
OnCalendar= DayOfWeek Year-Month-Day Hour:Minute:Second # параметр для задания таймера реального времени
# вместо DayOfWeek указать Sun, Mon, Tue, Wed, Thu, Fri, Sat . Чтобы таймер выполнялся ежедневно, нужно не указывать значение DayOfWeek или указать на его месте Mon..Sun
# вместо указания цифр для Year-Month-Day Hour:Minute:Second можно оставить *

# Пример для запуска в каждый вечер пятницы:
# OnCalendar= Fri *-*-* 18:00:00

# Пример для запуска каждое 15 число месяца:
# OnCalendar= *-*-15
....

Справка о формате времени доступна по команде man 7 systemd.time

Монотонные таймеры

Блок кода
title/etc/systemd/system/<МоноТаймер>.timer
....
[Timer]
# Формат <Событие> = <интервал>:
OnActiveSec=50minutes
# Перечень значений параметра <Событие>, с момента которых ведется отсчёт времени, указанный значением <интервал> таймера:
# OnActiveSec - старт текущего юнита таймера 
# OnBootSec - после загрузки ОС
# OnStartupSec - после начала сеанса текущего пользователя
# OnUnitActiveSec - при старте юнита
# OnUnitInactiveSec - при завершении работы юнита

# Пример указания <Событие> = <интервал> :
# OnActiveSec=50minutes
# В указанном примере таймер сработает вновь через 50 минут после собственного запуска 
....
В указанном примере таймер вновь через 50 минут после собственного запуска 
....

Где:

Перечень значений параметра <Событие>, с момента которых ведется отсчёт времени, указанный значением <интервал> таймера:

  • OnActiveSec - старт текущего юнита таймера; 
  • OnBootSec - после загрузки ОС;
  • OnStartupSec - после начала сеанса текущего пользователя;
  • OnUnitActiveSec - при старте юнита;
  • OnUnitInactiveSec - при завершении работы юнита.

Запуск таймера

Перед запуском таймера необходимо перезагрузить Перед запуском таймера необходимо перезагрузить systemd:

Command
systemctl daemon-reload

 И проверить юниты на наличие синтаксических ошибок:

Command

systemd-analyze verify <имя_юнита>

Запуск таймера:

Command
systemctl start <имя_таймера>
Информация

Когда отсчёт таймера реального времени доходит до нуля, таймер повторно выполняет запуск указанного юнита

Временное выполнение таймера

Чтобы инициировать таймер, который будет работать только пока существует текущий сеанс, выполнить:

Command
sudo systemd-run --<событие>="время" --unit="название службы"

 Где:

--<событие> это одно из событий срабатывания таймера: 

  • --on-active  с момента запуска самого таймера;

    Раскрыть
    titleПример

    Временный таймер, который создаст файл foo c помощью команды touch в каталоге /tmp через 30 секунд после своего старта:

    Command
    Titlesudo systemd-run --on-active=30 /bin/touch /tmp/foo

    Running timer as unit: run-u80.timer
    Will run service as unit: run-u80.service

    Содержимое каталога /tmp после срабатывания таймера:

    Блок кода
    titlels /tmp
    ...
    foo
  • --on-startup — после запуски ОС;

    Раскрыть
    titleПример

    Временный таймер, который перезапускает службу NetworkManager через 5 минут с момента загрузки ОС:

    Command
    Titlesudo systemd-run --on-startup=5m systemctl restart NetworkManager

    Running timer as unit: run-u80.timer
    Will run service as unit: run-u80.service

  • --on-unit-active — момент запуска указанного юнита;

    Раскрыть
    titleПример

    Временный таймер, который запускается через 2 часа после запуска сценария

    Command
    Titlesudo systemd-run --on-unit-active=2h /home/user/script.sh

    Running timer as unit: run-u80.timer
    Will run service as unit: run-u80.service

  • --on-unit-inactive — при завершении работы юнита;

    Раскрыть
    titleПример

    Временный таймер, который запускается через 2 часа с момента завершения сценария:

    Command
    Titlesudo systemd-run --on-unit-inactive=2h /home/user/script.sh

    Running timer as unit: run-u80.timer
    Will run service as unit: run-u80.service

  • --on-calendar — при наступлении определенного времени (см.Таймеры реального времени).

    Раскрыть
    titleПример

    Временный таймер, который делает запись в текстовый файл каждую минуту:

    Command
    Titlesystemd-run --user --on-calendar '*:0/1' /bin/sh -c "date >> ~/log.txt"

    Running timer as unit: run-r81fc2842fa884a639d020dea5faabb9d.timer
    Will run service as unit: run-r81fc2842fa884a639d020dea5faabb9d.service   # последовательность r81fc2842fa884a639d020dea5faabb9d это 
    идентификатор временного таймера

    Где *:0/1 - время выполнения (каждую минуту) , справка по формату времени см.  man systemd.time

    Содержимое текстового файла с записями:

    Блок кода
    title~/log.txt
    Пн 11 ноя 2024 10:03:00 MSK
    Пн 11 ноя 2024 10:04:00 MSK
    Пн 11 ноя 2024 10:05:00 MSK
    Пн 11 ноя 2024 10:06:00 MSK
    Пн 11 ноя 2024 10:07:00 MSK
    Пн 11 ноя 2024 10:08:00 MSK
    Пн 11 ноя 2024 10:09:00 MSK
    Пн 11 ноя 2024 10:10:00 MSK

Останов временного таймера:

Command
sudo systemctl --user stop run-r81fc2842fa884a639d020dea5faabb9d.timer

Где параметр --user запускает таймер от имени текущего пользователя, а r81fc2842fa884a639d020dea5faabb9d - идентификатор таймера. Временные таймеры хранятся в каталоге /run/systemd/transient если заданы без параметра --user или в /run/user/<идентификатор_пользователя>/systemd/transient. Идентификатор пользователя доступен по команде id -u, файлы временных таймеров, хранящихся в указанных каталогах и в качестве имени используют идентификаторы. 

 Справка см. man 1 systemd-run

Управление таймерами

  • получить список всех таймеров, определенных в системе:
    Command

    systemctl list-timers --all

  • получить список активных таймеров:
    Command

    systemctl list-timers

  • получить информацию о статусе конкретного таймера:
    Command

    systemctl status <имя_таймера>.timer

    указание systemctl status *timer выведет информацию обо всех таймерах, определенных в системе.

Пуск, автозапуск, перезапуск, останов, отключение аналогичны командам systemctl для служб. Справка доступна по команде man systemctl, краткая по systemctl -h

Просмотр журналов юнитов

Посмотреть записи журнала конкретного юнита:

Command
sudo journalctl -b -u <имя_юнита> # .service или .timer, параметр -b ограничивает вывод записей текущей загрузкой

Чтобы ограничить вывод записей определенным интервалом, используется параметры -S и -U (от и до), пример:

Command

sudo journalctl -S "2024-11-03 07:00:00" -U "2024-11-07 07:15:00" -u anacron.timer # имя юнита для примера

Информация

Anacron это вспомогательный инструмент cron для запуска пропущенных cron во время отключения компьютера заданий.

Следует различать параметры -u (юнит) и -U (до)

или конретным интервалом (пример - день назад):

Command

sudo journalctl -S -1d -u anacron.timer

Справка доступна по команде man journalctl , краткая справка по параметрам - journalctl -h

Начиная с очередного обновления 1.7 в Astra Linux Special Edition просмотр журналов юнитов возможен из графического интерфейса через Журнал аудита.