Timer systemctl

отображает все systemd-таймеры на системе

systemctl list-timers --all

systemctl list-timers --all | grep all_accsess

Создать собственный юнит сервиса

nano /etc/systemd/system/send_ip.service

[Unit]
Description=Send Ip This server
After=network.target

[Service]
Type=oneshot
ExecStart=/rpool/Slivak_500x10/info_server/send_ip.sh
WorkingDirectory=/rpool/Slivak_500x10/info_server/
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

[Install]
WantedBy=multi-user.target

Перезагружаем службу systemd:

systemctl daemon-reload

И пробуем запустить наш сервис:

systemctl start send_ip.service

systemctl status send_ip.service

journalctl -u send_ip.service

Unit

В [Unit] – можно указать зависимомти

Для указания строгой зависимости используйте Requires, например:

Requires=mysql.service

В случае если указанные в этой опции службы не получится запустить, запуск нашего сервиса также завершится неудачей.

Более мягкую зависимость предполагает директива Wants:

Wants=nginx.service

Если указанные службы не будут найдены или не смогут запуститься, то это никак не повлияет на работу нашего сервиса.

Обе директивы предусматривают параллельный запуск указанных в них служб.

Если к моменту запуска собственной службы какие-то сервисы уже должны быть запущены, то следует воспользоваться директивой After, скажем если нам нужно запускать службу после того, как будет поднята сеть, следует указать:

After=network.target

Service

Pдесь мы описываем нашу службу. Обязательно указываем тип, в нашем случае oneshot - одноразовый запуск и выполняемое действие в директиве ExecStart, для служб с типом oneshot таких директив можно указать несколько.

WorkingDirectory - для указания рабочей директории

Environment для задания переменных окружения

User, Group чтобы запустить сервис от указанного пользователя или группы

WorkingDirectory=/var/www
User=www-data
Group=www-data
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

Install

И завершает юнит секция [Install] в которой укажем уровень запуска сервиса:

[Install]
WantedBy=multi-user.target

lti-user.target соответствует runlevel=3 или многопользовательский режим без графики.


Создать таймер

nano /etc/systemd/system/send_ip.timer

[Unit]
Description= Send Ip This server
[Timer]
OnBootSec=1m
OnCalendar=*-*-* 02:02:00
[Install]
WantedBy=timers.target

Обратите внимание, что его название соответствует файлу юнита сервиса, но имеет другое расширение.

Чтобы таймер запускался каждый день в 02:02 используем: OnCalendar=*-*-* 02:02:00

Запустить

systemctl daemon-reexec
systemctl daemon-reload
systemctl enable --now backup.timer

Прверить результат для backup.timer

systemctl list-timers | grep backup

В секции [Timer] указываем условия запуска. Таймеры могут быть двух типов, событийные и монотонные.

Первые активируются по событию, вторые выполняются периодически. Из событийных таймеров нас будет интересовать OnBootSec, срабатывающий через указанное время после старта системы.

Из монотонных следует выделить:

Все указанные условия можно сочетать между собой. Например, чтобы указать запуск сервиса через полчаса после загрузки системы, а затем повторять каждые 15 минут укажем:

[Timer]
OnBootSec=30m
OnUnitActiveSec=15m

будет запускать .service каждые 15 минут после завершения предыдущего запуска, даже если он не был активирован ранее.

[Timer]
OnBootSec=5min
OnUnitInactiveSec=15min

таймер OnCalendar, позволяет указать нужную дату и время срабатывания. В качестве формата используется:

DOW YYYY-MM-DD HH:MM:SS

Где DOW - Day Of Week - день недели, это необязательный параметр. За ним следует указание года, месяца и дня через дефис и час, минута, секунда через двоеточие. Для указания любого значения можно использовать *, перечисления делаются через запятую, а диапазоны разделяются .. (двумя точками). Знак тильды ~ можно использовать для указания количества интервалов от конца диапазона, а косую черту / в качестве модификатора.

*:*:00 - каждую минуту
*:15:00 - в 15 минут каждого часа
*-*-1,5,7 *:00:00 каждый час 1, 5 и 7 числа
Mon *-*~1 если последний день месяца понедельник
Mon *-*~7/1 последний понедельник месяца

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

minutely - ежеминутно
hourly - каждый час
daily - каждый день
monthly - каждый месяц 
weekly - еженедельно
yearly - ежегодно
quarterly - ежеквартально
semiannually - раз в полгода

systemd предоставляет удобный инструмент для проверки таких конструкций, чтобы проверить ваше условие выполните, заключив анализируемые данные в кавычки:

systemd-analyze calendar "Mon *-*~7/1"

И завершает юнит секция [Install] со следующим содержимым:

[Install]
WantedBy=timers.target

systemctl daemon-reload

systemctl start send_ip.timer

systemctl status send_ip.timer

journalctl -u send_ip.timer

systemctl enable send_ip.timer

link: https://interface31.ru/tech_it/2021/04/nastraivaem-taymery-systemd-vmesto-zadaniy-cron.html