Systemd 服务(将 sh 脚本作为服务调用)- 如何获取更新的状态

Systemd 服务(将 sh 脚本作为服务调用)- 如何获取更新的状态

我有以下有效的 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'.

就我而言,我的脚本可以通过提供额外的输入参数进行稍微调整仅当ExecStartPostExecStopPost执行时

仅适用于这些命令的额外输入参数:

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单元”需要额外的工作。

相关内容