【发布时间】:2016-09-27 15:30:10
【问题描述】:
我尝试使用 systemd 启动多个进程 - 如果包含终止,则重新启动。唯一的区别是进程的参数。
有没有办法避免每个进程都有一个单元文件? 我正在为所有进程一起寻找一个单元文件。
通常我会使用启动脚本,但是——正如我所说——在终止的情况下重新启动也应该包括在内。而且我看不到使用纯系统和没有手工制作的 skriptlet 的方法。
谢谢!
【问题讨论】:
我尝试使用 systemd 启动多个进程 - 如果包含终止,则重新启动。唯一的区别是进程的参数。
有没有办法避免每个进程都有一个单元文件? 我正在为所有进程一起寻找一个单元文件。
通常我会使用启动脚本,但是——正如我所说——在终止的情况下重新启动也应该包括在内。而且我看不到使用纯系统和没有手工制作的 skriptlet 的方法。
谢谢!
【问题讨论】:
也许使用模板单元可以满足您的需求。来自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= 规范确保当目标停止或重新启动时,每个组件也是如此。在 myservice.target 中使用 Requires= 必须启动每个组件才能使 myservice 成功启动。我认为应该是,如果任何单个组件发生故障,则应该终止任何未发生故障的组件;即它的全部或全部。如果这不是您想要的,您可以使用 Want= 而不是 Requires=。
这有点尴尬,但是如果您需要提供多个参数,您可以通过环境变量引入间接。对于模板单元,添加Environment=args=%i 并将ExecStart 中的%i 替换为$args。我认为找到替代方案会更好,但在不了解您的用例的情况下,我不确定该解决方案是什么。
【讨论】: