是否可以编写一个 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
在服务模板中指定是否希望实例与某些其他目标关联)。