我有以下有效的 systemctlsystemd
启动脚本,可以在重新启动时自动完美启动(其他 dbdeployer 依赖项也启动)。
我在这里.sh script
创建了几个不同的“状态”,基本上是为了所调用的服务。
(一个启动脚本使用docker 撰写项目,而另一个是为了dbdeployer mysql 实例)
Systemd 服务单元docker-compose 容器:
[Unit]
Description=Magento 2.3.5 Docker-Compose Containers
After=dbdeployer-mysql-5-731-in-1.service
Requires=docker.service dbdeployer-mysql-5-731-in-1.service
[Service]
EnvironmentFile=/var/www/_systemd.startups_/glolighting/magento/2_35/docker-compose.mag2.35.env.file
#Environment=FILE_SCRIPT=/var/www/docker/_systemd.startups_/magento/2_35/dc-glo-mag235.sh
#PassEnvironment=$DCFOLDER
Type=simple
TimeoutStartSec=0
Restart=always
RestartSec=4s
RemainAfterExit=yes
#WorkingDirectory=${DC_PROJECT_FOLDER}
ExecStartPre=mkdir -p ${LOGFOLDER}
ExecStartPre=echo ${DC_PROJECT_FOLDER}
ExecStartPre=echo Starting Docker-compose service for ${DESCRIPTION}...
ExecStartPre=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1
ExecStart=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 2
ExecStartPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1
ExecStop=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 3
ExecStopPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1
[Install]
WantedBy=multi-user.target
脚本被调用systemd
:
____truncated for relevance___
# Continue on success
if [ $arguments_correct -eq 1 ]; then
cd $PATH_DOCKER_COMPOSE_PROJECT_FILE
if [ $OPTION -eq 1 ]; then
echo "$LINE"
echo ""
$(which docker-compose) ps
echo ""
echo "$LINE"
elif [ $OPTION -eq 2 ]; then
$(which docker-compose) start
elif [ $OPTION -eq 3 ]; then
$(which docker-compose) stop
fi
exit 0
fi
我希望ExecStartPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1
能为我提供正确的输出,(换句话说$(which docker-compose) ps
,但是有一个延迟 - docker 容器可能需要大约 3-10 秒。因此,由于每次调用命令时此状态都不会更新(重新查询)status
,我只看到原始发生时的输出ExecStartPost
。
总结一下:一旦我这样做了systemctl status docker-compose-mag235.service
,我会得到输出,表明一些 docker-containers 仍然处于exit/starting
状态。
问题
有什么方法可以使用systemctl status docker-compose-mage235.service
(或等效systemctl
命令)给我一个更新状态。 _换句话说:$(which docker-compose) ps
我运行这个新的 systemctl 命令时的状态。
(在创建这些启动 systemd 服务之前,我总是假设每次调用都会“重新查询”状态,但后来我意识到它只是从日志文件中获取最后的输出(很可能syslog
))。
笔记:
调用/location/of/project/file/of/docker-compose.yml
是可能的,但我宁愿只是想容纳不同的systemd services
,我可以基于 Docker Compose 项目查询,换句话说,我有用于不同 DC 项目的多个文件夹。然后我需要创建别名,但在这样做之前我会知道是否systemd
可以帮助我。
答案1
不,这是不可能的,除非你能以某种方式docker-compose
向 systemd 的日志发送额外的信息。
systemctl status
显示服务的状态以及该服务的最新日记条目。
您可以通过运行查看更多日志条目journalctl -b0 -p 0..7 -u docker-compose
。这将为您提供自上次重新启动以来的所有 docker-compose 日志条目。
答案2
感谢@cas 指出无法直接获取“更新状态” systemd
。他指给我并建议:
您的 ExecStartPost 脚本没有理由不能在完成之前不断重复检查一切是否启动正常(每次检查之间有一秒钟或两次或更长时间的睡眠)。是否可以将更多状态信息输出到日志日志 - 我不知道......也许打印到 STDERR
然后,这让我意识到我可能会延迟脚本,这与我最初的目标相反:直接从systemd 'somestatuscommand-that-queries'
.
就我而言,我的脚本可以通过提供额外的输入参数进行稍微调整仅当ExecStartPost
和ExecStopPost
执行时。
仅适用于这些命令的额外输入参数:
ExecStartPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1 **4**
ExecStopPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1 **4**
____truncated for relevance___
# Continue on success
if [ $arguments_correct -eq 1 ]; then
cd $PATH_DOCKER_COMPOSE_PROJECT_FILE
if [ $OPTION -eq 1 ]; then
if [ $sleep_correct -eq 1]; then
# Sleep here when requested (and sleep input verified above)
sleep $SLEEP
fi
#Now docker-compose ps has been given enough time to query after containers were started/stopped.
echo "$LINE"
echo ""
$(which docker-compose) ps
echo ""
echo "$LINE"
elif [ $OPTION -eq 2 ]; then
$(which docker-compose) start
elif [ $OPTION -eq 3 ]; then
$(which docker-compose) stop
fi
exit 0
fi
不知道为什么systemd
没有提供这种类型的功能 - 我假设一些我现在无法理解的重要设计决策,但这意味着每个“脚本类型systemd
单元”需要额外的工作。