我尝试使用systemd启动多个进程 - 如果终止包含则重新启动。唯一的区别是流程的论点。
有没有办法避免每个进程的单元文件? 我正在为所有进程寻找一个单元文件。
通常我会使用start-skript但是 - 正如我所说 - 在终止的情况下重新启动也应该包括在内。而且我没有办法用纯系统和没有手工制作的skriptlet来做到这一点。
谢谢!
答案 0 :(得分:3)
也许使用模板单元符合您的需求。来自systemd.unit(5)
可选地,可以在运行时从模板文件中实例化单元。这允许从单个配置文件创建多个单元。如果systemd查找单元配置文件,它将首先在文件系统中搜索文字单元名称。如果没有成功并且单元名称包含“@”字符,systemd将查找一个单元模板,该单元模板共享相同的名称但是删除了实例字符串(即“@”字符和后缀之间的部分)。示例:如果请求服务getty@tty3.service且找不到该名称的文件,systemd将查找getty @ .service并从该配置文件中实例化服务(如果找到)。
要从配置文件中引用实例字符串,您可以在许多配置选项中使用特殊的“%i”说明符。有关详细信息,请参阅下文。
因此,您可以创建一个文件myservice @ .service,其内容类似于
[Unit]
Description=MyService component %i
PartOf=myservice.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myservice %i
Restart=on-failure
和主单元myservice.target为
[Unit]
Description=Myservice
Requires=myservice@a.service myservice@b.service myservice@c.service
myservice @ .service中的PartOf =规范确保当目标停止或重新启动时,每个组件也是如此。使用Requires = in myservice.target必须启动每个组件以使myservice成功启动。我认为应该是这样的情况:如果任何单个组件发生故障,任何未失败的组件都应该终止;即全部或全部。如果那不是您想要的,您可以使用Want =而不是Requires =。
这有点尴尬,但如果你需要提供多个参数,你可以通过环境变量引入间接。对于模板单元,添加Environment=args=%i
并将ExecStart中的%i
替换为$args
。我认为找到替代方案会更好,但如果不了解您的用例,我不确定该解决方案是什么。