首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Systemd服务(调用sh脚本作为服务)-如何获得更新状态

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

Unix & Linux用户
提问于 2021-05-05 10:48:48
回答 2查看 632关注 0票数 0

我有下面的运行系统too systemd启动脚本,它会在重新启动时自动启动(其他dbdeployer依赖项也会启动)。

这是一个.sh script,我在这里创建了几个不同的‘状态’,基本上是为被调用的服务创建的。

(一个启动脚本使用docker项目,另一个用于dbdeployer实例)

用于码头组合容器的

系统服务单元:

代码语言:javascript
复制
[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:

调用的脚本

代码语言:javascript
复制
____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是否能帮助我。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2021-05-05 13:01:57

不,这是不可能的,除非你可以让docker-compose发送额外的信息到systemd的日记。

systemctl status显示服务的状态,以及服务的最新日记条目。

您可以通过运行journalctl -b0 -p 0..7 -u docker-compose查看更多的日志条目。这将为您提供自上次重新启动以来所有的坞-撰写日志日志条目。

票数 2
EN

Unix & Linux用户

发布于 2021-05-06 09:15:26

感谢@cas指出,不可能直接从systemd获得“更新的状态”。他指着我说:

您的ExecStartPost脚本没有理由不能在完成之前反复检查所有的启动是否正常(每次检查之间有一两秒钟或更多的睡眠)。是否可以将更多的状态信息输出到日志日志-我不know....maybe打印到STDERR

这让我意识到,我可能只是延迟脚本,而不是我最初的目标:直接从systemd 'somestatuscommand-that-queries'获得状态。

在我的例子中,当ExecStartPost ExecStopPost执行时,可以通过提供额外的输入参数D4来稍微修改脚本。

仅用于以下命令的额外输入参数:

代码语言:javascript
复制
ExecStartPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1 **4**
ExecStopPost=bash ${SERVICE_FILE_SCRIPT} ${DC_PROJECT_FOLDER} 1 **4**
代码语言:javascript
复制
____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单元”都需要额外的工作。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/648216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档