包含 ExecStop 命令导致服务(consul)无法正常启动

包含 ExecStop 命令导致服务(consul)无法正常启动

我正在consul尝试建立一个小型 CoreOS 集群。如果我将以下文件保存到/etc/systemd/system/consul.service,启用服务,然后重新启动虚拟机,集群中的所有 3 个虚拟机将愉快地正常启动并连接在一起

[Unit]
Description=consul
After=etcd2.service
After=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill consul
ExecStartPre=-/usr/bin/docker rm consul
ExecStart=/usr/bin/docker run -d --name consul --network host consul agent -server -bootstrap-expect=3 -data-dir /tmp/consul -bind BIND_IPADDR --node NODE_NAME -retry-join IPADDR1 -retry-join IPADDR2
# ExecStop=/usr/bin/docker container exec consul consul leave
# ExecStopPost=/usr/bin/docker container stop consul
# ExecStopPost=/usr/bin/docker container rm consul

[Install]
WantedBy=multi-user.target

但是,如果我从命令中删除注释ExecStop,则启动将失败,因为虚拟机重新启动后没有领事容器正在运行。systemctl --failed但不会报告任何服务失败。

我究竟做错了什么?我是不是误会了ExecStopConsul

答案1

问题(或者至少问题)是-d您在ExecStart=.

systemd 希望它运行的命令在服务启动时保持运行,换句话说,在前台运行。至少在设置 的服务时Type=simple,这是默认类型并且适用于您的设备。

当您运行一个立即退出的命令时(就像这样docker run -d做),systemd 假设您的服务已启动并仅保持一段时间直至完成。因此,当您的容器仍在运行时,systemd 服务会认为它没有运行。您可以使用类似 的命令来确认这一点systemctl status consul.service。 (经常检查此命令可以帮助您了解 systemd 认为您的服务状态是什么。在此处发布其输出以帮助我们诊断您遇到的任何进一步问题。)

当您有一些命令时,给您带来麻烦的ExecStopPost=是 systemd 将执行这些命令,因为它假设服务已完成,因此会杀死您的容器。

-d只需从命令docker run中删除ExecStart=就足以解决您的问题。

相关内容