Вы просматриваете старую версию данной страницы. Смотрите текущую версию.

Сравнить с текущим просмотр истории страницы

« Предыдущий Версия 156 Следующий »

Данная статья применима к

  • 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 — системная служба, которая запускает в указанное время перечисленные для неё задания. Служба запускается один раз при загрузке системы. Редактирование списка заданий рекомендуется выполнять при помощи команды:

sudo crontab -e

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

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

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

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

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

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

Таймеры реального времени systemd не связаны с RTOS (real-time operating system)

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

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

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

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

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


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

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

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

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

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

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

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

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

/etc/systemd/system/Example.service
[Unit]
# Имя и описание службы
Description=this is a test example of the service 
# Тип службы, указан oneshot, без порождения подпроцессов для упрощения взаимодействия с таймерами
Type=oneshot
 
[Service]
# Перезапуск при сбое, необязательный параметр
Restart=on-failure 
# Пример выполняемой команды
ExecStart=/usr/local/bin/<имя файла или сценария>

Где:

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

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

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

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

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

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

Общая структура юнитов таймеров реального времени:

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

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

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

# Необязательные параметры
Persistent=true 
AccuracySec=1h
WakeSystem=30s

# Необязательная для таймеров секция
[Install]
WantedBy=timers.target

Где:

  • Description обязательный параметр, краткое описание таймера, допускаются пробелы;
  • Unit обязательный параметр, имя юнита запускаемой службы, файла .service

    Следует различать секцию [Unit] определяющую юнит таймера и параметр Unit, определяющий юнит службы .service, которым будет управлять таймер


  • OnCalendar обязательный параметр для таймеров реального времени, определяет момент запуска службы из параметра Unit в указанный интервал. 
    Общий формат :

    OnCalendar=DayOfWeek Year-Month-Day Hour:Minute:Second. Допускается опускать какой либо из промежутков времени указывая вместо них *. Справка о формате времени доступна по команде man 7 systemd.time

    • каждое 15 число месяца: 
      OnCalendar= *-*-15

    • каждый день, с понедельника по пятницу, утром в 7:00:
      OnCalendar=Mon..Fri *-*-* 7:00:00

    • каждую субботу и воскресенье вечером в 19:00 и в 19:30:
      OnCalendar=Sun,Sat *-*-* 19,19:30:00

    • если последний день месяца пятница:
      OnCalendar=Fri *-*~1

    проверить или уточнить формат даты можно командой:

    systemd-analyze calendar Mon..Sun

     Original form: Mon..Sun
    Normalized form: *-*-* 00:00:00
       Next elapse: Fri 2024-11-29 00:00:00 MSK
          (in UTC): Thu 2024-11-28 21:00:00 UTC
          From now: 8h left

    Где Mon..Sun интересующий момент времени.

    Для таймеров реального времени допускается указание нескольких параметров OnCalendar с разными интервалами времени и моментами срабатывания

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

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

systemctl list-unit-files --type=target

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


Общая структура юнитов монотонных таймеров:
/etc/systemd/system/<МоноТаймер>.timer
[Unit]
# Имя и краткое описание таймера
Description= 
 
[Timer]
# Формат <Событие>=<интервал>. В указанном примере таймер вновь через 50 минут после собственного запуска
OnActiveSec=50minutes
 
# Здесь указывается имя юнита службы 
Unit=Example.service
 
# Необязательные параметры
Persistent=true
AccuracySec=1h
WakeSystem=30s
 
# Необязательная для таймеров секция
[Install]
WantedBy=timers.target

Где:

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

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

перечень значений параметра <интервал> задается указанием временного промежутка (15m — 15 минут, 1h — один час и т.д. ) подробнее  см. man systemd.time

Запуск и отладка таймера

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

sudo systemctl daemon-reload

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

systemd-analyze verify <имя_юнита>.timer # или .service

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

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

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

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

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

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

 Где:

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

  • --on-boot — OnBootSec;

    Временный таймер, который 


  • --on-active  OnActiveSec;

  • --on-startup OnStartupSec;

  • --on-unit-active — OnUnitActiveSec;

  • --on-unit-inactiveOnUnitInactiveSec;

  • --on-calendarOnCalendar.

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

    systemd-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

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

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

    ~/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

Временный таймер самостоятельно создает юнит службы .service c идентификатором временного таймера в качестве названия. Юнит службы временного таймера содержит указанные при запуске через systemd-run параметры. Временные таймеры и их службы существуют, пока существует пользовательская сессия, в которой они были запущены и исчезают после её завершения.

Принудительный останов временного таймера:

sudo systemctl --user stop run-r81fc2842fa884a639d020dea5faabb9d.timer

Где параметр --user запускает таймер от имени текущего пользователя, а r81fc2842fa884a639d020dea5faabb9d - идентификатор таймера.  Справка см. man 1 systemd-run

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

  • получить список всех таймеров, определенных в системе:
    systemctl list-timers --all
  • получить список активных таймеров:
    systemctl list-timers
  • получить информацию о статусе конкретного таймера:
    systemctl status <имя_таймера>.timer

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

Пуск, автозапуск, перезапуск, останов, отключение аналогичны командам 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 просмотр журналов юнитов возможен из графического интерфейса через Журнал аудита.


  • Нет меток