Назад | Перейти на главную страницу

Как настроить несколько служб systemd на использование одного таймера?

Я заметил некоторые существенные различия в подходе к некоторым системным документам и документам с практическими рекомендациями относительно того, как настроить одну или несколько служб для использования одного и того же таймера.

Насколько мне удалось собрать воедино (хотя я могу ошибаться), это описывает то, что Разыскивается и Ед. изм параметры в файле службы и таймера должны быть установлены на (здесь не используются реальные примеры кода - чтобы уменьшить длину сообщения) для одной службы и, наоборот, для конфигурации нескольких служб с использованием одного таймера:

Таймер на разовую услугу

My.Service1 'WantedBy' Param: N/A (1)
My.Timer 'Unit' Param: My.Service1 (2)
My.Timer 'WantedBy' Param: MultiUser/Basic.Target (3) 

(1) Сервисному файлу не нужен раздел [Install] с параметром WantedBy.

(2) В разделе таймера [Timer] параметр Unit должен указывать на служебный файл My.Service1.

(3) В файле таймера есть параметр WantedBy, указывающий на какую-то специальную системную цель, которая будет использоваться для ее запуска.

Таймер для нескольких сервисов

My.Service1 'WantedBy' Param: Timer.Target (1)
My.Service2 'WantedBy' Param: Timer.Target (1)
My.Service3 'WantedBy' Param: Timer.Target (1)
Timer 'Unit' Param: Timer.Target (2)
Timer 'WantedBy' Param: ???

(1) Все службы должны подключаться к одной и той же цели с помощью параметра WantedBy.

(2) Параметр [Timer] Unit также должен указывать на цель.

Пример последней конфигурации см. это практическое руководство. Я буду считать это примером 1. Однако я нашел другие практические примеры, которые отклоняются от этого (см. Ниже).

Пример 2 и Пример 3 скажем, это должно быть настроено так:

My.Service1 WantedBy: Timer.Target
My.Service2 WantedBy: Timer.Target
My.Service3 WantedBy: Timer.Target
Timer 'Unit' Param: My.Service1 (1)
Timer 'WantedBy' Param: MultiUser/Basic.Target

(1) Это должно быть упущением в документации, потому что если вы оставите устройство, указывающее только на одну из ваших многочисленных служб, другие службы не смогут использовать таймер. Возможно, это было из-за подхода «см. Выше», использованного там, чтобы вернуть читателя к конфигурации единой службы без фактического упоминания (что важно), что необходимо изменить.

Затем с Пример 4 его конфигурация выглядит так, как будто она действительно будет работать, но она связывает службы с целью другим способом, создавая служебные файлы непосредственно под /etc/systemd/system/Timer.Target.wants/ подкаталог и исключает любые параметры WantedBy в служебных файлах. Таким образом:

My.Service1 'WantedBy' Param: N/A
My.Service2 'WantedBy' Param: N/A
My.Service3 'WantedBy' Param: N/A
Timer 'Unit' Param: Timer.Target
Timer 'WantedBy' Param: MultiUser/Basic.Target

Гибридный подход между примерами 1 и 4, который я видел, заключается в создании служебных файлов в / и т.д. / systemd / system / каталог (расположение по умолчанию) и создать символическую ссылку на эти служебные файлы в папке /etc/systemd/system/Timer.Target.wants файл и исключить параметр WantedBy в служебном файле (который функционально эквивалентен примеру 4), в то время как другая конфигурация использует метод символической ссылки, но дополнительно включает параметр WantedBy в служебный файл (который кажется избыточным и ненужным).

Мой вопрос был бы таков для примера 4 и гибридных подходов: зачем помещать что-либо под *. хочет directory вообще необходимо, если объявление параметра WantedBy должно инструктировать systemd сделать это за вас (как указано в объяснении этого параметра в эта страница)?

Может ли кто-нибудь пролить свет на лучший способ настройки нескольких служб с использованием одного и того же таймера на фоне сбивающего с толку множества подходов к этому?

Если вы хотите активировать несколько служб с помощью одного таймера, вставьте цель между ними:

Блок таймера, назовем его foo.timer:

[Unit]
Description=My timer that runs saturdays, 9am and triggers foo.target

[Timer]
OnCalendar=Sat 9:00
Unit=foo.target

[Install]
WantedBy=timers.target

Целевой модуль, назовем его foo.target:

[Unit]
Description= My target unit, that groups my two services xxx.service and yyy.service
Wants=xxx.service yyy.service
After=xxx.service yyy.service

[Install]
Also=foo.timer

А затем две службы xxx.service и yyy.service:

[Unit]
Description=My service XXX

[Service]
ExecStart=/bin/echo I am XXX

[Install]
Also=foo.timer
[Unit]
Descritpion=My service YYY

[Service]
ExecStart=/bin/echo I am YYYY

[Install]
Also=foo.timer

Скопируйте эти четыре файла модулей (foo.timer, foo.target, xxx.service, yyy.service) в / etc / systemd / systemd /. Затем включите и запустите таймер, введя «systemctl enable --now foo.timer». Это подключит foo.timer к timers.target, который является общей целью, которая должна задействовать все различные таймеры, определенные в системе. Обратите внимание, что вы также можете сделать «systemctl enable foo.target» btw, а также «systemctl enable zzz.service», поскольку строки «Также =» в этих модулях передают запросы на включение в foo.timer.

Таймер systemd всегда активирует один юнит.

Если вы хотите активировать два устройства по одному и тому же расписанию, я рекомендую для ясности создать два файла таймера, которые содержат одно и то же расписание.

В противном случае вы можете создать файл «служебной единицы», который запускает две службы, которые вам нужны.

Я не думаю, что «WantedBy =» - особенно полезная концепция для таймеров.