使用多个execStart进行系统化

Ric*_*rdo 33 linux service systemd server

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

[Unit]
Description=script description

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

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

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

ale*_*vag 53

如果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
Run Code Online (Sandbox Code Playgroud)

然后你执行:

$ systemctl start foo@parameter1.service foo@parameter2.service
Run Code Online (Sandbox Code Playgroud)

要么...

目标依赖项

您可以创建链接到单个目标的多个单元:

#/etc/systemd/system/bar.target
[Unit]
Description=bar target
Requires=multi-user.target
After=multi-user.target
AllowIsolate=yes
Run Code Online (Sandbox Code Playgroud)

然后你只需修改你的.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
Run Code Online (Sandbox Code Playgroud)

然后你就可以并行启用你想要的foo服务,并像这样启动bar目标:

$ systemctl daemon-reload
$ systemctl enable foo@param1.service
$ systemctl enable foo@param2.service
$ systemctl start bar.target
Run Code Online (Sandbox Code Playgroud)

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

  • 你也可以在 `foo@.service` 的 `[Unit]` 部分添加 `PartOf=bar.target`。这允许在停止目标时停止服务。 (4认同)
  • 非常好的解决方案!但请注意,“systemctl stop bar.target”不会停止任何这些链接服务:'( (2认同)
  • 请注意,如果您希望在系统引导期间启动 `bar.target`,则需要将带有 `WantedBy=multi-user.target` 行的 `[Install]` 部分添加到 `bar.target` 中,并使用下一个命令启用此目标: `systemctl enable bar.target` (2认同)

小智 9

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

[Unit]
Description=script description

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

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

  • 但是在控件中,我读到“分别在ExecStart =中的命令之前或之后执行的其他命令。语法与ExecStart =中的相同,不同之处在于允许多条命令行并且这些命令依次依次执行“就您而言,我应该等待第一个脚本成功执行之后,系统才启动第二个脚本吗?谢谢 (2认同)