Systemd 多个 execStart 的设置

99

是否可以使用相同的脚本创建具有不同输入参数的服务?

例如:

[Unit]
Description=script description

[Service]
Type=simple
ExecStart=/script.py parameters1
ExecStart=/script.py parameters2
Restart=on-failure

[Install]
WantedBy=multi-user.target

有可能吗?

它会以串行模式启动吗?还是以两个不同的进程启动?


5
为什么这个被关闭了? 显然,这个问题涉及到特定的问题和软件工具,主要是由程序员使用的。 - aquirdturtle
2个回答

152

如果你的单元文件中 Type=simple,那么你只能指定一个 ExecStart,但是你可以添加多个ExecStartPreExecStartPost,但这些都不适合于长时间运行的命令,因为它们是串行执行的,每次启动的进程在下一个开始之前被杀死。

如果你想要运行多个单元并行执行,有几件事情你可以做:

如果它们在1个参数上不同

你可以使用模板单元,创建一个 /etc/systemd/system/foo@.service。注意:(@很重要)

[Unit]
Description=script description %I

[Service]
Type=simple
ExecStart=/script.py %i
Restart=on-failure

[Install]
WantedBy=multi-user.target

然后执行以下命令:

$ systemctl start foo@parameter1.service foo@parameter2.service

目标依赖

您可以创建多个单元,这些单元链接到一个目标:

#/etc/systemd/system/bar.target
[Unit]
Description=bar target
Requires=multi-user.target
After=multi-user.target
AllowIsolate=yes

然后你只需要修改你的 .service 单元,将 WantedBy=bar.target 修改成如下:

#/etc/systemd/system/foo@.service
[Unit]
Description=script description %I

[Service]
Type=simple
ExecStart=/script.py %i
Restart=on-failure

[Install]
WantedBy=bar.target
然后您只需并行启用所需的foo服务,然后像这样启动bar目标:
$ systemctl daemon-reload
$ systemctl enable foo@param1.service
$ systemctl enable foo@param2.service
$ systemctl start bar.target

注意: 这适用于任何类型的单位,而不仅仅是模板单位。


2
非常好的解决方案!但请注意,systemctl stop bar.target不会停止任何这些链接服务 :'( - jirislav
1
@Spartaok 你可以执行 systemctl stop foo@* - aleivag
6
您可以在foo@.service[Unit]部分中添加PartOf=bar.target。这样可以在停止target时停止服务。 - Johny
4
请注意,如果您希望在系统启动时启动 bar.target,则需要在 bar.target 中添加 [Install] 部分并使用 WantedBy=multi-user.target 行,然后使用以下命令启用此目标: systemctl enable bar.target - Johny
你也可以使用“systemd多服务应用程序”http://alesnosek.com/blog/2016/12/04/controlling-a-multi-service-application-with-systemd/ - rogerdpack
显示剩余3条评论

32

您可以使用ExecStartPreExecStartPost其中一个脚本。

[Unit]
Description=script description

[Service]
Type=simple
ExecStartPre=/script.py parameters1
ExecStart=/script.py parameters2
Restart=on-failure

[Install]
WantedBy=multi-user.target

3
在控制台中,我读到了“在ExecStart=命令之前或之后执行的其他命令。语法与ExecStart=相同,不同之处在于允许多个命令行,并且这些命令将按顺序一个接一个地被执行。”在您的情况下,我应该等待第一个脚本成功运行后再启动第二个脚本吗?谢谢。 注:如果需要翻译其他内容,请提出新的问题。 - Riccardo
是的,在这个解决方案中,您应该等待第一个脚本成功。另一个解决方案是创建一个 bash 脚本,获取 parameters1parameters2,然后将它们传递给 Python 脚本。 - amin khozaei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接