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

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

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

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

  • 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, но обладают более гибкими настройками периодов работы;
  • монотонные таймеры запускающиеся в назначенное время, прошедшее с определенной начальной точки

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

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

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

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


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

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

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

Systemd имеет несколько зарезервированных системных юнитов, перечень которых доступен по команде man systemd.special. Использование имён юнитов из перечня системных нежелательно и приводит к ошибке выполнения создаваемого юнита.

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

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

[Service]
ExecStart=/usr/local/bin/<имя файла или сценария> # примеры выполняемой команды

Справка доступна по команде man systemd.units

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

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

[Timer]
<Событие срабатывания таймера>
Unit=<имя юнита запускаемой службы>.service

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

Persistent=true # выполнить немедленно после старта системы, если предыдущий запуск был пропущен

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

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

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

Перечень целевых состояний:

systemctl list-unit-files --type=target

Справка доступна по команде man systemd.timer

Событие срабатывания таймера

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

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

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

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

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

systemctl daemon-reload

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

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

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

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

Сценарий необходимо выполнять с правами администратора

make-systemd-timer.sh
#!/bin/bash

# параметр для отладки сценария
set -e

#создаем файл службы .service
echo "[Unit]
Description=My test unit # имя и описание службы
Type=oneshot # тип службы, указан oneshot, без порождения подпроцессов для упрощения взаимодействия с таймерами

[Service]
ExecStart=/usr/bin/echo "Привет мир"

[Install]
WantedBy=multi-user.target
" > /etc/systemd/system/test.service

#создаем файл службы .timer
echo "[Unit]
Description=My test timer
Requires=test.service

[Timer]
Unit=test.service
OnActiveSec=5minutes
Persistent=true
[Install]
WantedBy=timers.target 
" > /etc/systemd/system/test.timer

# добавим созданные юниты в автозагрузку и запустим их
systemctl enable test.service
systemctl enable test.timer
systemctl start test.service
systemctl start test.timer 

Проверка тестового таймера:

sudo systemctl status test.service

○ test.service - My test unit  # имя и описание службы
    Loaded: loaded (/etc/systemd/system/test.service; enabled; preset: enabled)
    Active: inactive (dead) since Mon 2024-11-11 13:55:11 MSK; 10min ago
  Duration: 3ms
TriggeredBy: test.timer
   Process: 4011 ExecStart=/usr/bin/echo Привет мир (code=exited, status=0/SUCCESS)
  Main PID: 4011 (code=exited, status=0/SUCCESS)
       CPU: 3ms

ноя 11 13:55:11 pcmk-1 systemd[1]: Started test.service - My test unit  # имя и описание службы.
ноя 11 13:55:11 pcmk-1 echo[4011]: Привет мир
ноя 11 13:55:11 pcmk-1 systemd[1]: test.service: Deactivated successfully.


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

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

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

 Где:

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

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

  • --on-startup — при запуске ОС;

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

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

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

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

systemctl --user stop run-<идентификатор_временного_таймера>.timer

Где параметр --user запускает таймер от имени текущего пользователя.

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

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   # последовательность r81fc2842fa884a639d020dea5faabb9d это 
идентификатор временного таймера

Содержимое файла:

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

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

systemctl --user stop run-r81fc2842fa884a639d020dea5faabb9d.timer

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

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


  • Нет меток