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

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.
Информация
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=this is a test example of the service # имя и описание службы
Type=oneshot # тип службы, указан 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

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

Блок кода
title/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

    Раскрыть
    titleПримеры
    • каждое 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

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

    Command
    Titlesystemd-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

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

Command

systemctl list-unit-files --type=target

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


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

Где:

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

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

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

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

Command
sudo systemctl daemon-reload

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

Command

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

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

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

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

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

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

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

 Где:

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

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