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] – можно указать зависимомти
Для указания строгой зависимости используйте Requires, например:
Requires=mysql.service
В случае если указанные в этой опции службы не получится запустить, запуск нашего сервиса также завершится неудачей.
Более мягкую зависимость предполагает директива Wants:
Wants=nginx.service
Если указанные службы не будут найдены или не смогут запуститься, то это никак не повлияет на работу нашего сервиса.
Обе директивы предусматривают параллельный запуск указанных в них служб.
Если к моменту запуска собственной службы какие-то сервисы уже должны быть запущены, то следует воспользоваться директивой After, скажем если нам нужно запускать службу после того, как будет поднята сеть, следует указать:
After=network.target
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] 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
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