我尝试使用 systemd 启动多个进程 - 如果它终止包括重新启动。唯一的区别是过程的参数。
有没有办法避免每个进程的单元文件?我正在为所有进程寻找一个单元文件。
通常我会使用 start-skript 但是 - 正如我所说 - 还应该包括在终止的情况下重新启动。而且我看不到使用纯 systemd 和没有手工制作的 skriptlets 来做到这一点的方法。
谢谢!
也许使用模板单元适合您的需求。来自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
Run Code Online (Sandbox Code Playgroud)
和主单元 myservice.target 作为
[Unit]
Description=Myservice
Requires=myservice@a.service myservice@b.service myservice@c.service
Run Code Online (Sandbox Code Playgroud)
myservice@.service 中的 PartOf= 规范确保当目标停止或重新启动时,每个组件也是如此。在 myservice.target 中使用 Requires= 必须启动每个组件才能成功启动 myservice。我认为应该是这样,如果任何单个组件失败,则应该终止任何没有失败的组件;即它的全有或全无。如果这不是您想要的,您可以使用 Want= 而不是 Requires=。
这有点尴尬,但是如果您需要提供多个参数,您可以通过环境变量引入间接。对于模板单元,在 ExecStart 中添加Environment=args=%i并替换%i为$args. 我认为最好找到替代方案,但在不了解您的用例的情况下,我不确定该解决方案是什么。
| 归档时间: |
|
| 查看次数: |
2099 次 |
| 最近记录: |