使用多个execStart进行系统化

时间:2018-01-10 20:12:52

标签: linux service server systemd

我知道是否可以使用以不同输入参数开头的相同脚本创建服务。 如:

[Unit]
Description=script description

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

[Install]
WantedBy=multi-user.target

有可能吗?然后它会启动到串行模式?还是分成两个不同的过程?最好的问候

2 个答案:

答案 0 :(得分:41)

如果单元文件中有Type=simple,则只能指定一个ExecStart,但可以添加ExecStartPre, ExecStartPost`,但这些都不适用于长时间运行的命令,因为它们被执行在开始下一个之前,所有人都会被杀死。

如果Type=oneshot您可以指定多个ExecStart,则它们不是并行连续运行。

如果你想要的是并行运行多个单元,你可以做一些事情:

如果他们在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服务,并像这样启动吧目标:

$ systemctl daemon-reload
$ systemctl enable foo@param1.service
$ systemctl enable foo@param2.service
$ systemctl start bar.target

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

答案 1 :(得分:8)

您可以将ExecStartPreExecStartPost用于其中一个脚本

[Unit]
Description=script description

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

[Install]
WantedBy=multi-user.target