Подробнее посмотрим на юниты 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.