3.9.11.1 Настройка и использование systemd-таймеров
Скачать документ Системные таймеры и чтение информации о них
Примеры использования таймеров
Создание таймеров
Преимущества и недостатки работы с таймерами
Таймеры — файлы юнитов systemd, имя которых имеет суффикс .timer; они позволяют контролировать файлы .service или определенные события. Эти таймеры могут быть использованы в качестве замены cron. Таймеры имеют встроенную поддержку календарных и регулярных событий и могут запускаться в асинхронном режиме.
Вы можете подробнее ознакомиться с созданием и настройкой systemd-таймеров, просмотрев наши обучающие видео:
на RuTube — Настраиваем таймеры systemd вместо заданий cron;
в Яндекс.Дзен — Настраиваем таймеры systemd вместо заданий cron;
в VK Видео — Настраиваем таймеры systemd вместо заданий cron.
На наших каналах вы также сможете найти много другой полезной информации.
Системные таймеры и чтение информации о них
Когда система РЕД ОС устанавливается на компьютер, создается несколько системных таймеров, являющихся частью процедур обслуживания системы.
Чтобы увидеть, какие таймеры работают на данный момент, введите команду:
systemctl status *timer ● fstrim.timer - Discard unused blocks once a week Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; preset: enabled) Active: active (waiting) since Thu 2024-12-19 08:27:01 MSK; 5h 33min ago Trigger: Mon 2024-12-23 01:09:54 MSK; 3 days left Triggers: ● fstrim.service Docs: man:fstrim дек 19 08:27:01 localhost systemd[1]: Started fstrim.timer - Discard unused blocks once a week.● logrotate.timer - Daily rotation of log files Loaded: loaded (/usr/lib/systemd/system/logrotate.timer; enabled; preset: enabled) Active: active (waiting) since Thu 2024-12-19 08:27:01 MSK; 5h 33min ago Trigger: Fri 2024-12-20 00:18:40 MSK; 10h left Triggers: ● logrotate.service Docs: man:logrotate(8) man:logrotate.conf(5) дек 19 08:27:01 localhost systemd[1]: Started logrotate.timer - Daily rotation of log files.● dnf-makecache.timer - dnf makecache --timer Loaded: loaded (/usr/lib/systemd/system/dnf-makecache.timer; enabled; preset: enabled) Active: active (waiting) since Thu 2024-12-19 08:27:01 MSK; 5h 33min ago Trigger: Thu 2024-12-19 15:49:48 MSK; 1h 49min left Triggers: ● dnf-makecache.service дек 19 08:27:01 localhost systemd[1]: Started dnf-makecache.timer - dnf makecache --timer.● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static) Active: active (waiting) since Thu 2024-12-19 08:27:01 MSK; 5h 33min ago Trigger: Fri 2024-12-20 08:42:17 MSK; 18h left Triggers: ● systemd-tmpfiles-clean.service Docs: man:tmpfiles.d(5) man:systemd-tmpfiles(8) дек 19 08:27:01 localhost systemd[1]: Started systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories.
С каждым таймером связано, по меньшей мере, шесть строк, содержащих сведения о нём:
Имя файла таймера и короткое описание цели существования этого таймера (но не всегда).
Сведения о состоянии таймера - загружен ли таймер, полный путь к файлу таймера, состояние vendor preset (disabled или enabled).
Сведения об активности таймера, куда входят данные о том, когда именно таймер был активирован.
Дата и время следующего запуска таймера и примерное время, оставшееся до его запуска.
Имя сервиса или события, вызываемого таймером.
Некоторые (но не все) таймеры содержат указатели на документацию.
Примеры использования таймеров
Самым простым примером использования таймеров можно считать системный таймер systemd-tmpfiles-clean. Как следует из названия, данный таймер раз в некоторое время производит очистку временных файлов системы.
● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; stati Active: active (waiting) since Thu 2024-12-19 08:27:01 MSK; 5h 33min ago Trigger: Fri 2024-12-20 08:42:17 MSK; 18h left Triggers: ● systemd-tmpfiles-clean.service Docs: man:tmpfiles.d(5) man:systemd-tmpfiles(8)
Данный таймер является системным и включен по умолчанию.
Создание таймеров
В системе РЕД ОС юниты systemd располагаются в следующих директориях:
/usr/lib/systemd/system — юниты, поставляемые вместе с системой и устанавливаемыми приложениями;
/etc/systemd/system — юниты системного администратора.
Для примера будет создан простой файл конфигурации сервиса, запускающий команду free (утилита, выводящая информацию об использовании оперативной памяти). Это может пригодиться, если необходимо регулярно отслеживать объём свободной памяти.
Создайте unit-файл с именем ramMonitor.service в папке /etc/systemd/system.
sudo nano /etc/systemd/system/ramMonitor.service
И добавьте в него следующие строки:
[Unit]
Description=Monitors RAM # Описание сервиса
Wants=ramMonitor.timer # Зависимость, отсылается к таймеру (будет создан позже)
[Service]
Type=oneshot # Тип службы, означающий выполнение одного задания и завершение
ExecStart=/usr/bin/free # Указывается полный путь к исполняемому файлу программы
[Install]
WantedBy=multi-user.target # Указывается, на каком уровне происходит запуск сервиса. Параметр multi-user.target указывает на запуск в многопользовательском режиме без графики
Данный файл можно назвать простейшим файлом конфигурации сервиса.
После проведенных манипуляций, проверьте состояние вашего сервиса командой:
systemctl status ramMonitor.service ● ramMonitor.service - Monitors RAM Loaded: loaded (/etc/systemd/system/ramMonitor.service; disabled; preset: disabled) Active: inactive (dead)
Сервис существует, но не активен. Запустите сервис и проверьте его статус:
systemctl start ramMonitor.service systemctl status ramMonitor.service ● ramMonitor.service - Monitors RAM Loaded: loaded (/etc/systemd/system/ramMonitor.service; disabled; preset: disabled) Active: inactive (dead) дек 19 14:39:45 localhost.localdomain systemd[1]: Starting Monitors RAM... дек 19 14:39:45 localhost.localdomain systemd[1]: ramMonitor.service: Succeeded. дек 19 14:39:45 localhost.localdomain systemd[1]: Finished Monitors RAM. дек 19 14:39:45 localhost.localdomain free[3288]: total used дек 19 14:39:45 localhost.localdomain free[3288]: Mem: 2016164 871644 дек 19 14:39:45 localhost.localdomain free[3288]: Swap: 4162552 384768
При включении сервиса в терминале не выводится никаких сообщений. Это происходит, потому что по умолчанию стандартный вывод (stdout) от программ, запускаемых systemd, перенаправляется в журнал systemd.
Чтобы проверить этот журнал, воспользуйтесь командой:
journalctl -u ramMonitor.service дек 19 14:39:45 localhost.localdomain systemd[1]: Starting Monitors RAM... дек 19 14:39:45 localhost.localdomain systemd[1]: ramMonitor.service: Succeeded. дек 19 14:39:45 localhost.localdomain systemd[1]: Finished Monitors RAM. дек 19 14:39:45 localhost.localdomain free[3288]: total use
дек 19 14:39:45 localhost.localdomain free[3288]: Mem: 2016164 871644
дек 19 14:39:45 localhost.localdomain free[3288]: Swap: 4162552 384768
С помощью ключа -S вы можете указать временной период, за который утилита journalctl будет искать записи. Например, journalctl -S today -u ramMonitor.service
выведет записи, сделанные за сегодня.
Убедившись в работоспособности сервиса, создайте для него таймер. Для этого необходимо создать в той же папке файл с названием ramMonitor.timer.
nano /etc/systemd/system/ramMonitor.timer
В файл добавьте следующее содержимое:
[Unit]
Description=Monitors RAM
Requires=ramMonitor.service # Указание строгой зависимости
[Timer]
Unit=ramMonitor.service # Ссылка на сервис
OnCalendar=*-*-* *:*:00 # Срабатывание таймера по условию календаря. В данном случае – каждую минуту
[Install]
WantedBy=timers.target
В секции [Timer] указываются условия запуска. Таймеры могут быть двух типов: событийные и монотонные. Первые активируются по событию, вторые выполняются периодически. Из событий таймеров можно выделить OnBootSec, срабатывающий через определенное время после запуска системы. Из монотонных следует выделить:
OnUnitActiveSec — срабатывает через указанное время после активации целевого юнита;
OnUnitInactiveSec — срабатывает так же, как OnUnitActiveSec, только время отсчитывается с момента прекращения работы целевого юнита, хорошо подходит для «длительных» задач, например, бекапов.
OnCalendar — срабатывает по условию календаря.
В качестве формата даты для календаря используется формат:
DOW YYYY-MM-DD HH:MM:SS
(где DOW (Day Of Week) — день недели, необязательный параметр; за ним следует указание года, месяца, дня через дефис и часы, минуты и секунды через двоеточие. Для указания любого значения используется «*», перечисления делаются через запятую, а диапазоны через «..»).
После завершения настройки нужно запустить таймер и проверить его статус:
systemctl start ramMonitor.timer systemctl status ramMonitor.timer ● ramMonitor.timer - Monitors RAM Loaded: loaded (/etc/systemd/system/ramMonitor.timer; disabled; vendor pres Active: active (waiting) since Thu 2024-12-19 14:39:45 MSK; 7s ago
Trigger: Thu 2024-12-19 14:40:45 MSK; 29s left
Triggers: ● ramMonitor.service дек 24 14:39:45 localhost.localdomain systemd[1]: Started Monitors RAM.
Если все настроено верно, таймер будет иметь состояние active (waiting), а ниже будет указано время до его запуска.
Преимущества и недостатки работы с таймерами
Основные преимущества:
Задачи могут быть легко запущены сразу, независимо от их таймеров - это упрощает отладку.
Каждая задача может быть настроена для работы в определенной среде.
Задачи могут быть настроены в зависимости от других юнитов systemd.
Задачи регистрируются в журнале systemd.
Единственным недостатком можно считать сложность создания таких таймеров: чтобы настроить задачу, запускаемую в определенное время при помощи systemd, нужно создать два файла и использовать команды systemctl. По сравнению с добавлением одной строки в crontab. Кроме того в systemd отсутствует встроенный аналог cron’овского MAILTO для отправки писем при сбоях.
Дата последнего изменения: 19.12.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.