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

Организация сервисов / демонов с системами: запуск более 100 демонов, сгруппированных по 3

Я новичок в 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