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

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

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

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

  • 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]
Restart=on-failure # перезапуск при сбое, необязательный параметр
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 . Чтобы таймер выполнялся ежедневно, нужно не указывать значение DayOfWeek или указать на его месте Mon..Sun
# вместо указания цифр для Year-Month-Day Hour:Minute:Second можно оставить *

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

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

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

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

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

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

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


  • Нет меток