Добавить в корзинуПозвонить
Найти в Дзене

Linux. Переодические процессы. Системные таймеры.

В предыдущей статье рассмотрели такое средство управления периодическими процессами как cron. Но в Linux, этим средством управление не ограничивается. А в некоторых дистрибутивах, так и вовсе отказались от использования сron. С приходом systemd ( о нем можно почитать тут тыц ), кроме смены управлением процессами, пришло так же и смена управлением их периодического вызова. Итак, в этой статье поговорим о системных таймерах. Таймеры конечно мощнее, чем cron, но ими правда и сложнее управлять и настраивать. Управление происходит с помощью двух файлов: Описаны таймеры в отличии от crontab могут быть в абсолютных календарных терминах ("Среда в 9 утра"), так и относительно других событий ("Через 1 минуту после загрузки системы"). Параметры можно объединять, чтобы получить то расписание, которое именно нужно. Обычно используются следующие параметры OnActiveSec - Относительно времени, в которое активируется таймер. OnBootSec - Относительно загрузки системы OnStartupSec - Относительно време

В предыдущей статье рассмотрели такое средство управления периодическими процессами как cron. Но в Linux, этим средством управление не ограничивается. А в некоторых дистрибутивах, так и вовсе отказались от использования сron. С приходом systemd ( о нем можно почитать тут тыц ), кроме смены управлением процессами, пришло так же и смена управлением их периодического вызова.

Итак, в этой статье поговорим о системных таймерах. Таймеры конечно мощнее, чем cron, но ими правда и сложнее управлять и настраивать. Управление происходит с помощью двух файлов:

  • модуль таймера, в котором указывается непосредственно расписание и средства запуска.
  • модуль службы, здесь указывается, что именно нужно запустить.

Описаны таймеры в отличии от crontab могут быть в абсолютных календарных терминах ("Среда в 9 утра"), так и относительно других событий ("Через 1 минуту после загрузки системы"). Параметры можно объединять, чтобы получить то расписание, которое именно нужно. Обычно используются следующие параметры

OnActiveSec - Относительно времени, в которое активируется таймер.

OnBootSec - Относительно загрузки системы

OnStartupSec - Относительно времени, когда система была запущена.

OnUnitActiveSec - Относительно времени, в течении которого указанное устройство было активным.

OnUnitInactiveSec - Относительно времени, в течении которого устройство было неактивно

OnCalendar - Определенный день и время.

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

$systemctl list-timers

Можно будет увидеть вывод, который обычно состоит из 6 столбцов.

NEXT - время следующего запуска таймера.

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

LAST - время, когда таймер был выполнен в последний раз.

PASSED - сколько времени прошло со времени отработки таймера

UNIT - Какой юнит системного таймера был запущен

ACTIVATES - Какой сервис был запущен.

Файлы модулей таймера находятся по умолчанию в каталоге /usr/lib/systemd/system и имеют суффикс timer в имени. Давайте посмотрим в один из этих таймеров. У меня, например, стандартный таймер, который устанавливается по умолчанию в дистрибутив CentOS, и который служит для удаления временных файлов, выглядит так

$cat /usr/lib/systemd/system/systemd-tmpfiles-clean.timer
$cat /usr/lib/systemd/system/systemd-tmpfiles-clean.timer

В разделе [Unit] указано краткое описание (Description) таймера и связанные с этим таймером страницы руководства (Documentation). Далее в разделе [Timer] идут параметры:

OnBootSec = 15 min - говорит нам о том, что таймер активируется через 15 минут после загрузки системы.

OnUnitActiveSec=1d -сообщает, что далее таймер будет работать один раз в день.

Как Вы можете заметить, в содержании файла отсутствует описание, того, что надо запустить. Целевой модуль можно явно задать с помощью параметра Unit, либо, как в данном случае, действует правило по умолчанию, таймер запускает модуль службы, которые имеет точно такое же имя, но с суффиксом service.

$ cat /usr/lib/systemd/system/systemd-tmpfiles-clean.service
$ cat /usr/lib/systemd/system/systemd-tmpfiles-clean.service

Здесь в разделе [Unit] присутствует краткое описание модуля и условия его запуска. И в разделе [Service], какую непосредственно команду он выполняет. ( более подробно про параметры модулей можно почитать здесь: Systemd. Модули и модульные файлы.)

Для создания собственного таймера, придется создавать два файла .timer и .service в каталоге /etc/systemd/system. Активировать его необходимо будет командой

$systemctl enable name.timer

Так же можно создать временный таймер. Для этого используется команда systemd-run. С помощью этой команды таймер создастся, без создания в ручную файлов таймера и службы. Например, следующая команда создаст таймер, который будет чистить каталог /tmp каждый час, начиная с 12-00:

$systemd-run --on-calendar '12/1:0:0' rm -rf /tmp
Running timer as unit: run-rf4d251b576b7418ab629447bb5669610.timer
Will run service as unit: run-rf4d251b576b7418ab629447bb5669610.service

Как видим из вывода, создались автоматически два файла: таймера и службы. В них можно заглянуть с помощью команды

$systemctl list-units

Остановить выполнение такого таймера можно командой

$systemctl stop run-rf4d251b576b7418ab629447bb5669610.timer

Создаются временные таймеры в каталоге /run/systemd/system и после перезагрузки системы удаляются. Но при желании Вы можете скопировать их в /etc/systemd/system и установить их на постоянной основе. Не забудьте только перед запуском такого постоянного модуля, выключить временный.

Заключение.

Сегодня познакомились еще с одним средством для управления периодическими процессами. Что выбрать для ежедневного использования, не посоветую. Используйте то, что Вам нужно в рамках поставленной задачи. Единственное, обращаю еще раз внимание на то, что, и crontab, и таймеры в системе могут работать одновременно. И при выяснении, как выполняется конкретное задание, нужно проверять оба средства.