systemd type=具有多次调用的分叉服务

systemd type=具有多次调用的分叉服务

是否可以编写一个 systemd 服务,例如:

[Service]
Type=forking
ExecStart=forksomething

systemctl --user start forksomething.service并在第一次调用仍在运行时允许第二次?

我已经考虑过制作它[email protected],并且开始时"forksomething@$(date +'%s').service",我只是希望能有一些不那么老套的东西。 (编辑:实际上,这会更糟,因为它也必须创建符号链接和守护程序重新加载。)

答案1

一旦创建[email protected]并运行systemctl daemon-reload一次,systemd就可以启动任意数量的[email protected]服务,而无需进一步的守护进程重新加载。

事实上,你[email protected]实际上是一个服务模板。您可以使用实例名称中的 后面的部分@作为模板中的参数。例如,如果您这样定义服务:

[Service]
Type=forking
ExecStart=/usr/local/bin/forksomething "%i"

然后运行:

systemctl daemon-reload
systemctl start [email protected]
systemctl start [email protected]
systemctl start [email protected]

然后 systemd 将为您运行命令/usr/local/sbin/forksomething 1,/usr/local/sbin/forksomething 2和。/usr/local/sbin/forksomething 3

如果您希望前两个实例从此时开始在每次启动时持续启动,您只需要说和。这些命令将自动创建到适当目录的适当符号链接。systemctl enable [email protected]systemctl enable [email protected]/etc/systemd/system/<whatever>.target.wants/

服务模板的实例只需尝试启动它即可被调用;仅当您希望它与某个目标单元持久关联时才需要符号链接(通常default.target或者multi-user.target如果您希望在启动时启动某些内容,尽管您可以Before=some.target在服务模板中指定是否希望实例与某些其他目标关联)。

相关内容