linux - 具有多个 execStart 的 Systemd

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

例子:

[Unit]
Description=script description

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

[Install]
WantedBy=multi-user.target

有可能吗?

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

最佳答案

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

如果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 服务,然后像这样启动 bar 目标:

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

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

https://stackoverflow.com/questions/48195340/

相关文章:

linux - 在 shell 脚本的 for 循环中迭代行而不是单词

python - 这是在 Python 中运行 shell 脚本的正确方法吗?

linux - 来自 shell 的 GROUP BY/SUM

linux - 如何使用 mount(8) 和 fstab 注册 FUSE 文件系统类型?

c - 格式化结构时间规范

python - 如何使用 Python 获取硬盘序列号

linux - 将任何当前目录 './' 添加到 Linux 中的搜索路径

linux - 列出包含字符串但 *NOT* 包含另一个字符串的文件的 Unix 命令

linux - 将 AWK 结果分配给变量

linux - 为什么用 grep -q 退出代码 141?