SystemD - Таймеры (timer)
Юниты SystemD типа timer
Итак, мы уже познакомились с юнитами SystemD — service и target . Сейчас познакомимся с ещё одним типом юнитов — с таймерами (timer).
Таймеры позволяют по расписанию запускать службы. Это можно использовать как замену cron. Чтобы лучше понять, как работают таймеры проделаем следующее:
- Создадим скрипт;
- Создадим сервис, который будет запускать этот скрипт;
- Создадим таймер, который будет запускать сервис по определённому расписанию.
Создаём скрипт
Скрипт, который я создаю (timer.sh), просто записывает текущее время в файл (date.log):
$ nano timer.sh
#!/bin/bash
date >> ~/date.log
После этого, нужно разрешить запускать этот скрипт нашему пользователю:
$ chown u+x timer.sh
Создаём service SystemD
Затем создадим сервис SystemD, который будет запускать этот скрипт:
$ 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:
$ 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 минуты, нужно использовать этот параметр.
Как вы уже знаете, после создания новых юнитов нужно выполнять следующую команду:
$ sudo systemctl daemon-reload
Запустим службу для проверки что скрипт работает как надо и проверим это посмотрев лог:
$ sudo systemctl start test-timer.service
$ cat date.log
Fri 22 Jul 2022 02:06:00 PM MSK
Проверим лог через пару минут:
$ 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.
Если понравилась статья, подпишись на мой канал в VK или Telegram .