
Я заметил существенные различия в подходах в некоторых документах 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, который я видел, заключается в создании файлов служб в/etc/systemd/system/каталог (расположение по умолчанию) и создать символическую ссылку на эти служебные файлы в/etc/systemd/system/Timer.Target.wantsфайл иисключатьпараметр WantedBy в файле службы (что функционально эквивалентно примеру 4), в то время как другая конфигурация использует метод символической ссылки, но дополнительно включает параметр WantedBy в файл службы (что кажется избыточным и ненужным).
Однако мой вопрос будет таким для Примера 4 и гибридных подходов: почему следует помещать что-либо под*.хочеткаталог вообще необходим, если объявление параметра WantedBy должно указывать systemd сделать это за вас (как указано в объяснении этого параметра наэта страница)?
Может ли кто-нибудь пролить свет на наилучший способ настройки нескольких служб с использованием одного таймера среди запутанного многообразия подходов к этому?
решение1
Если вы хотите активировать несколько служб с помощью одного таймера, вставьте цель между ними:
Назовем его таймером foo.timer
:
[Unit]
Description=My timer that runs saturdays, 9am and triggers foo.target
Wants=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]
Description=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
, поскольку Also=
строки в этих единицах распространяют запросы на включение в направлении foo.timer
.
решение2
Таймер systemd всегда активирует один блок.
Если вы хотите активировать два устройства по одному и тому же расписанию, я рекомендую для ясности создать два файла таймера, содержащие одно и то же расписание.
В противном случае вы можете создать файл «единицы службы», который запускает две нужные вам службы.
Я не думаю, что «WantedBy=» — особенно полезная концепция для таймеров.