【问题标题】:Systemd with multiple execStart [closed]具有多个 execStart 的 Systemd [关闭]
【发布时间】:2018-06-20 02:10:42
【问题描述】:

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

[Unit]
Description=script description

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

[Install]
WantedBy=multi-user.target

有可能吗?那么它将启动到串行模式?还是分成两个不同的过程?

【问题讨论】:

    标签: linux service server systemd


    【解决方案1】:

    如果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
    

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

    【讨论】:

    • 非常好的解决方案!但请注意systemctl stop bar.target 不会停止任何这些链接服务:'(
    • @aleivag 如果我想停止所有正在运行的服务怎么办?我应该为每项服务执行systemctl stop foo@param_number.service 吗?如果我有 100 个服务注册到同一个目标?
    • @Spartaok 你做systemctl stop foo@*
    • 您也可以将PartOf=bar.target 添加到foo@.service[Unit] 部分。这允许在停止目标时停止服务。
    • 请注意,如果您希望在系统引导期间启动bar.target,您需要将带有WantedBy=multi-user.target 行的[Install] 部分添加到bar.target 并使用以下命令启用此目标:systemctl enable bar.target
    【解决方案2】:

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

    [Unit]
    Description=script description
    
    [Service]
    Type=simple
    ExecStartPre=/script.py parameters1
    ExecStart=/script.py parameters2
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    

    【讨论】:

    • 但是在控件中我读到了“在 ExecStart= 中的命令之前或之后执行的附加命令。语法与 ExecStart= 相同,除了允许多个命令行和命令依次连续执行“在您的情况下,我应该等待第一个脚本成功,然后系统启动第二个脚本?谢谢
    • 是的,在这个解决方案中,您应该等待第一个脚本成功。另一种解决方案是创建获取parameters1parameters2 的bash 脚本,然后将它们传递给python 脚本。
    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2019-11-17
    • 1970-01-01
    • 2015-08-18
    • 2014-10-22
    • 1970-01-01
    相关资源
    最近更新 更多