SystemD — Таймеры (timer)

Подробнее посмотрим на юниты SystemD с типом Timer. Эти юниты сейчас набирают популярность для замены планировщика заданий — cron.















Юниты SystemD типа timer




Итак, мы уже познакомились с юнитами SystemD — service и target. Сейчас познакомимся с ещё одним типом юнитов — с таймерами (timer).




Таймеры позволяют по расписанию запускать службы. Это можно использовать как замену cron. Чтобы лучше понять, как работают таймеры проделаем следующее:




  • Создадим скрипт;
  • Создадим сервис, который будет запускать этот скрипт;
  • Создадим таймер, который будет запускать сервис по определённому расписанию.




Создаём скрипт




Скрипт, который я создаю (timer.sh), просто записывает текущее время в файл (date.log):




alex@deb:~$ nano timer.sh
#!/bin/bash
date >> ~/date.log




После этого, нужно разрешить запускать этот скрипт нашему пользователю:




alex@deb:~$ chown u+x timer.sh




Создаём service SystemD




Затем создадим сервис SystemD, который будет запускать этот скрипт:




alex@deb:~$ sudo nano /etc/systemd/system/test-timer.service
[Unit]
Description=test timer

[Service]
Type=oneshot
ExecStart=/home/alex/timer.sh
User=alex




Создаём timer SystemD




И наконец, создадим timer SystemD:




alex@deb:~$ sudo nano /etc/systemd/system/test-timer.timer
[Unit]
Description=test timer

[Timer]
OnUnitActiveSec=30s
Unit=test-timer.service
AccuracySec=1s

[Install]
WantedBy=timers.target




Здесь мы указали следующее:




  • OnUnitActiveSec=30s — этот параметр определяет отсчёт времени от момента запуска юнита, который был активирован таймером. Другими словами отсчет ведётся с момента запуска test-timer.service, и когда он доходит до нуля, таймер срабатывает вновь. Вместо этого параметра можно использовать следующие:
    • OnActiveSec — отсчёт относительно момента активации самого таймера.
    • OnBootSec — отсчёт ведётся с момента запуска компьютера, например через 30 секунд, после запуска компьютера.
    • OnUnitInactiveSec — отсчёт начинается с момента деактивации юнита, который запускается таймером. Этот параметр противоположен OnUnitActiveSec.
    • OnCalendar — определяет таймер реального времени. Этот параметр может быть указан несколько раз, если нужно. Вот пример — Thu,Fri 2012-*-1,5 11:12:13 — юнит будет запущен в 11:12:13, первого или пятого дня любого месяца 2012 года, но только если этот день приходится на четверг или пятницу.
      • Все эти параметры можно включать в 1 таймер. При этом, запускаемый юнит будет выполнен, когда любой из отсчётов дойдёт до нуля.
      • Время можно указывать не только в секундах, например можно указать следующее значение: OnBootSec=5h 30min.
  • Unit=test-timer.service — здесь мы указали какой юнит следует запускать.
  • AccuracySec=1s — точность таймера равна 1 секунде. По умолчанию точность таймера равно 1 минуте. Поэтому для заданий, которые выполняются чаще 1 минуты, нужно использовать этот параметр.




Как вы уже знаете, после создания новых юнитов нужно выполнять следующую команду:




alex@deb:~$ sudo systemctl daemon-reload




Запустим службу для проверки что скрипт работает как надо и проверим это посмотрев лог:




alex@deb:~$ sudo systemctl start test-timer.service

alex@deb:~$ cat date.log
Fri 22 Jul 2022 02:06:00 PM MSK




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




alex@deb:~$ sudo systemctl start test-timer.timer




Проверим лог через пару минут:




alex@deb:~$ cat date.log
Fri 22 Jul 2022 02:06:00 PM MSK
Fri 22 Jul 2022 02:07:18 PM MSK
Fri 22 Jul 2022 02:07:49 PM MSK
Fri 22 Jul 2022 02:08:20 PM MSK
Fri 22 Jul 2022 02:08:51 PM MSK
Fri 22 Jul 2022 02:09:22 PM MSK
Fri 22 Jul 2022 02:09:53 PM MSK
Fri 22 Jul 2022 02:10:24 PM MSK
Fri 22 Jul 2022 02:10:55 PM MSK
Fri 22 Jul 2022 02:11:26 PM MSK




Вот так работают таймеры в SystemD.









Итог




Мы познакомились с новым типом юнитов SystemD — timer. И на практике создали расписание по которому будет выполнятся скрипт.




Документация по SystemD timer доступна здесь.




Как настраиваются события календаря (OnCalendar) описано здесь, в блоке Calendar Events.










2022-08-12T13:49:22
Администрирование Linux