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


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *