Там у меня есть определенные услуги, которые я обычно начинаю вместе: скажем, зоокейпер + кафка + элассандра. Есть ли способ, как написать составной блок: все начинается вместе, все умирает вместе? Это означает, что если я начну это, то ему будет поручено все это начать, и наоборот. Что было бы правильным способом сделать это?
2 ответа
Один из способов состоит в том, чтобы все три службы зависели от оставшихся двух, используя Requires=
.
- one.service:
Requires=two.service three.service
- two.service:
Requires=one.service three.service
- три.сервис: и т. д.
Это не создаст цикл - зависимости не зависят от порядка запуска.
(Тем не менее, вы должны объявить некоторые До = или После =, например, если kafka нужно запустить после zookeeper.)
Другой метод заключается в создании целевого модуля, если он зависит от ваших трех служб, а службы будут PartOf=
единица. (К сожалению, пока еще невозможно иметь ConsistsOf = в самой .target.)
- all.target:
Requires=one.service two.service three.service
- one.service:
PartOf=all.target
- и т.п.
(Опять же, вы должны дополнительно объявить зависимости и порядок между сервисами; не полагайтесь только на .target, запускающий все).
Да, есть несколько способов сделать это.
Самый простой способ (который выполняет некоторые действия, описанные вами, но не все), заключается в создании целевого модуля и добавлении зависимостей для ваших служебных модулей (например, Requires=zookeeper.service kafka.service elassandra.service
а также устанавливается After=
в те же единицы.) Целевой модуль полезен для запуска всех этих модулей вместе, но на самом деле он не поможет вам остановить их все вместе (использование systemctl stop
на целевом модуле не остановит его зависимости). Есть способы, которыми вы можете остановить юниты, например, systemctl isolate multi-user.target
остановит все юниты, которые не являются зависимостями этой цели, что означает, что юниты, запущенные вручную, будут остановлены, но это намного сильнее, чем остановка небольшого набора юнитов. так что, вероятно, не очень подходит ...
Возможно, лучшим подходом является использование директивы PartOf=
, которая в точности соответствует описанию. Вы можете либо создать "фиктивный" сервисный блок для совместного управления всеми сервисами, либо выбрать один из ваших сервисов и сделать другие PartOf
этого сервиса.
Вам необходимо настроить PartOf=
во всех блоках, которые вы хотите запускать и останавливать вместе, в вашем случае это zookeeper.service, kafka.service и elassandra.service. Но учтите, что вам не обязательно изменять сами файлы сервисного модуля (например, если они поставляются с самим программным обеспечением в пакетах deb или rpm). Вы можете использовать файлы переопределения (которые вы можете создать с помощью systemctl edit
), чтобы добавить небольшой фрагмент конфигурации к существующему модулю, который позволит вам легко определять отношения PartOf=
между модулями, даже если они определены в файлах, которые вы предпочитаете не изменять.