成功完成另一个单元后指示执行另一个单元

成功完成另一个单元后指示执行另一个单元

我使用cloud-config来安装和配置DCOS集群。

通常agentinstall.service服务需要 5 分钟才能完成。

是否可以指示systemd执行agentconfigure.service 仅在那之后 agentinstall.service完全的?

#云配置
核心:
  单位:
    - 名称:“agentinstall.service”
      命令:“开始”
      内容:|
        [单元]
        描述=代理设置
        之后=网络.目标

        [服务]
        类型=简单
        用户=root
        工作目录=/tmp
        ExecStartPre=/bin/curl -o /tmp/dcos_install.sh http://bootstapnode-0.dev.myztro.internal:9090/dcos_install.sh
        ExecStartPre=/bin/chmod 755 dcos_install.sh
        ExecStart=/bin/bash dcos_install.sh 从站

        [安装]
        WantedBy=多用户.target
    - 名称:“agentconfigure.service”
      命令:“开始”
      内容:|
        [单元]
        描述=代理配置
        之后=agentinstall.service

        [服务]
        类型=简单
        用户=root
        工作目录=/opt/mesosphere/etc/
        ExecStartPre=/bin/echo "MESOS_ATTRIBUTES=cluster:uploader" >> /opt/mesosphere/etc/mesos-slave-common
        ExecStartPre=/bin/rm -f /var/lib/mesos/slave/meta/slaves/latest
        ExecStart=/usr/bin/systemctl 重新启动 dcos-mesos-slave

        [安装]
        WantedBy=多用户.target

谢谢。

答案1

我不知道如何使用 systemd 来完成此任务,因为我认为它只关心单元的启动和运行。例如,您可以使用After=强制一个单元仅在指定单元启动后启动,或者两个单元并行启动。

Wants=将导致指定的单元并行启动(如果所需的单元尚未启动/活动),而不是您想要的。

Requires=After=如果与on结合使用agentconfigure.service,将确保在处于活动状态(“忙”)agentconfigure.service之后启动。agentinstall.service现在,您可以有一个等待循环,例如最多 5 分钟,并在继续实际工作之前agentconfigure.service定期检查是否完成。agentinstall.service我看到的唯一选择。

编辑:我认为更好的另一个选择......安装成功时agentinstall.service启动agentconfigure.service,然后退出。

答案2

您想在/bin/bash dcos_install.sh slave命令之后运行吗?

使用该命令将服务更改为Type=oneshot.另外,我认为您不需要使用 ExecStartPre=,只需使用 ExecStart= 即可。


@JdeBP 要求我指出您的echo命令正在尝试使用 shell 重定向这是行不通的

答案3

systemd 249,2021 年 7 月发布,添加了对新依赖类型的支持OnSuccess,它正是这样做的 - 允许您指定该单元完成后应运行哪些单元。

因此,如果您的主机有 systemd 249 或更高版本,则agentinstall.service需要:

[Unit]
Description=agent_setup
After=network.target
OnSuccess=agentconfigure.service

现在您可以执行此操作systemctl start agentinstall.service,并且每当完成时,agentconfigure.service都会自动启动。


对于完成 - 还有OnFailure=一个依赖项,它执行相同的操作,但仅在单元失败时触发。它已在 2013 年发布的 systemd v201 中引入。

相关内容