Я заметил некоторые существенные различия в подходе к некоторым системным документам и документам с практическими рекомендациями относительно того, как настроить одну или несколько служб для использования одного и того же таймера.
Насколько мне удалось собрать воедино (хотя я могу ошибаться), это описывает то, что Разыскивается и Ед. изм параметры в файле службы и таймера должны быть установлены на (здесь не используются реальные примеры кода - чтобы уменьшить длину сообщения) для одной службы и, наоборот, для конфигурации нескольких служб с использованием одного таймера:
Таймер на разовую услугу
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 =» - особенно полезная концепция для таймеров.