我使用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 中引入。