【问题标题】:Convert Upstart config with dynamic instances to Systemd service将带有动态实例的 Upstart 配置转换为 Systemd 服务
【发布时间】:2017-01-13 16:24:15
【问题描述】:
我有一个可以运行多个实例的 Upstart 服务。可以任意组合指定两个动态参数。
有没有办法将其转换为 systemd .service 文件?
start on (net-device-up and local-filesystems and runlevel [2345])
stop on runlevel [016]
instance $C,$B
exec [...] $C $B
respawn
【问题讨论】:
标签:
service
ubuntu-16.04
systemd
upstart
ubuntu-server
【解决方案1】:
systemd 支持模板,这些模板可用于使用单个模板启动服务的多个实例。来自man systemd.unit 中的文档:
可选地,可以在 runtie 中从模板文件中实例化单元。这允许创建
来自单个配置文件的多个单元。如果 systemd 查找单元配置文件,它
将首先在文件系统中搜索文字单元名称。如果 tat 没有成功并且单元名称包含一个“@”字符,systemd 将寻找一个具有相同名称但
删除了实例字符串(即“@”字符和后缀之间的部分)。示例:如果
请求了一个服务 getty@tty3.service 并且没有找到该名称的文件,systemd 将寻找
getty@.service 并从该配置文件中实例化一个服务(如果找到)。
要从配置文件中引用实例字符串,您可以在许多配置选项中使用特殊的“%i”说明符。
在您的情况下,为动态参数“c”和“b”启动服务可能如下所示:
systemctl start myservice@b-c.service
由于 systemd 仅支持实例名称中的一个变量,您可能需要编写包装器 shell 脚本,将实例名称“b-c”解包为分隔“b”和“c”的值以传递给您的底层服务。