如何创建复合 systemd 单元

如何创建复合 systemd 单元

我通常会同时启动某些服务:比如 zookeeper+kafka+elassandra。有没有办法编写复合单元:所有服务一起启动,所有服务一起终止?这意味着如果我启动这个服务,它将委托启动所有服务,反之亦然。正确的做法是什么?

答案1

一种方法是让所有三项服务依赖于剩下的两项服务Requires=

  • 一、服务:Requires=two.service three.service
  • 二、服务:Requires=one.service three.service
  • 三.服务:等

这不会产生循环——依赖关系与启动顺序无关。

(话虽如此,你应该声明一些 Before= 或 After=,例如如果 kafka 需要在 zookeeper 之后运行。)


另一种方法是创建一个 .target 单元,让它依赖于您的三个服务,并将这些服务作为PartOf=单元。(不幸的是,目前还不能在 .target 本身中使用 ConsistsOf=。)

  • 全部.目标:Requires=one.service two.service three.service
  • 一、服务:PartOf=all.target
  • ETC。

(再次强调,你应该另外声明服务之间的依赖关系和顺序;不要只依赖 .target 来启动一切。)

答案2

是的,有几种方法可以实现这一点。

最简单的一个(可以完成你所描述的部分功能,但不是全部)是创建一个目标单位并添加对服务单元的依赖关系(例如,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=单元之间的关系,即使它们是在您不想修改的文件中定义的。

相关内容