我有下面的运行系统too systemd启动脚本,它会在重新启动时自动启动(其他dbdeployer依赖项也会启动)。
这是一个.sh script,我在这里创建了几个不同的‘状态’,基本上是为被调用的服务创建的。
(一个启动脚本使用docker项目,另一个用于dbdeployer实例)
用于码头组合容器的
[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.targetsystemd:调用的脚本
____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,但是有一个延迟码头容器可以从3-10秒起)。因此,由于此状态并不是每次调用status命令时都更新(请求),所以我只在原始ExecStartPost发生时才看到输出。
总结一下:一旦我做了systemctl status docker-compose-mag235.service,我就会得到输出,说明一些码头容器仍然是exit/starting状态。
是否有任何方法可以使用systemctl status docker-compose-mage235.service (或等效的systemctl命令)给我一个updated状态。_In其他词:在我运行这个新的systemctl命令时,$(which docker-compose) ps的状态。
(在创建这些启动系统服务之前,我总是假设每个调用的状态都是“重新查询”的,但后来我意识到它只是从日志文件(很可能是syslog)获得的最后一个输出。
调用/location/of/project/file/of/docker-compose.yml是可能的,但我只想容纳不同的systemd services,我可以根据Docker项目进行查询,换句话说,对于不同的DC项目,我有多个文件夹。然后,我需要创建别名,但在我这样做之前,我会知道systemd是否能帮助我。
发布于 2021-05-05 13:01:57
不,这是不可能的,除非你可以让docker-compose发送额外的信息到systemd的日记。
systemctl status显示服务的状态,以及服务的最新日记条目。
您可以通过运行journalctl -b0 -p 0..7 -u docker-compose查看更多的日志条目。这将为您提供自上次重新启动以来所有的坞-撰写日志日志条目。
发布于 2021-05-06 09:15:26
感谢@cas指出,不可能直接从systemd获得“更新的状态”。他指着我说:
您的ExecStartPost脚本没有理由不能在完成之前反复检查所有的启动是否正常(每次检查之间有一两秒钟或更多的睡眠)。是否可以将更多的状态信息输出到日志日志-我不know....maybe打印到STDERR
这让我意识到,我可能只是延迟脚本,而不是我最初的目标:直接从systemd 'somestatuscommand-that-queries'获得状态。
在我的例子中,当ExecStartPost 和 ExecStopPost执行时,可以通过提供额外的输入参数D4来稍微修改脚本。
仅用于以下命令的额外输入参数:
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单元”都需要额外的工作。
https://unix.stackexchange.com/questions/648216
复制相似问题