Я новичок в systemd
.
У меня есть машина, на которой должно работать значительное количество демонов. Есть три типа демонов, назовите их демон-A, демон-B, демон-C.
Эти демоны всегда запускаются «группами» по 3 человека с конфигурацией, специфичной для этих 3.
Иногда необходимо перезапустить или остановить целую группу.
Как лучше всего объяснить это systemd
?
Мои текущие знания заставят меня просто создать новый .service
файл для каждого демон-A, демон-B, демон-C, для каждой конфигурации. Я немного заблудился, когда дело доходит до контрольных групп и фрагментов, поскольку я вроде как понимаю, что они делают, но практический вариант использования все еще немного выше меня.
Мне нужно было бы иметь возможность проверить определенную группу простым способом.
Это путь? Что плохого в таком большом количестве systemd
-управляемые службы?
systemd действительно имеет несколько вариантов конфигурации агрегата которые вы можете использовать для выражения зависимостей между этими сервисами.
В частности, вам захочется посмотреть на Requires=
, Before=
, After=
, BindsTo=
и PartOf=
, все из которых определяют различные способы, которыми модуль может быть запущен или остановлен по отношению к другим модулям. Есть несколько других, менее часто используемых, поэтому внимательно прочтите документацию на случай, если ваши демоны могут их использовать.
(Поскольку вы точно не сказали, каковы зависимости между вашими сервисами, я не могу рекомендовать, какой вариант вам следует использовать.)
Также systemd может иметь экземпляры единиц, которые запускают ту же службу, но с другой конфигурацией. Имя экземпляра юнита заканчивается на @
, а экземпляр - это имя, следующее за @
. В модульном файле %I
и %i
заменяются именем экземпляра, которое можно использовать для загрузки определенных файлов конфигурации. Например, в инстансовом модуле foo@.service
, вы можете указать:
ExecStart=/usr/bin/foo --daemon --config=/etc/foo/%i.conf
Затем, чтобы включить foo
служба в bar
Например, вы бы сказали:
systemctl enable foo@bar
Это приведет к запуску службы foo с /etc/foo/bar.conf.
Также обратите внимание, что вы также можете указать экземпляры в требованиях. Например, если a@.service
требует b@.service
с тем же именем экземпляра, вы можете сказать в a@.service
:
Requires=b@%i.service