背景
我们的服务专为金融领域的客户量身定制,分为多个独立而协同的模块。在这些模块中,Biz模块扮演着枢纽的角色,它不仅承担着对外提供接口的重要职责,而且还负责建立和维护与Mysql数据库的关键连接。其他所有模块都依赖于Biz模块。
为了实现自动化部署,我们编写了一套启动脚本。其中,validStart.sh脚本被设计用于判断服务是否成功启动。在第一版中,我们通过检查服务进程是否存在来判断服务是否启动完成,具体方法是使用ps命令加上pid参数来查询进程信息。
在客户实际使用中,我们发现了一些问题:
-
- 服务实际上并未启动完成时,系统却提示服务已经成功启动。
-
- 在多节点部署的情况下,由于服务尚未启动完成,其他服务就开始启动了,导致其他服务的请求被转移到了一个正在启动的节点中。
这些问题可能会影响客户的使用体验和系统的可靠性。因此,我们需要进一步优化validStart.sh脚本,以确保服务启动的准确性和稳定性。
实现方式
第一版
在第一版中我们在启动脚本中通过$!命令将pid记录到pidFile文件中,在validStart.sh脚本中轮训多次判断pid是否存在,用于判断服务是否启动成功。
源码如下:
#!/bin/bash
pidFile="biz-server.pid"
pidTmpFile="biz-server.tmp.pid"
function validate(){
if [ "${3}" == "false" ]; then
return 1
fi
pidFile=$1
totalTime=$2
while [[ $totalTime -gt 0 ]]; do
if [ -f "$pidFile" ]; then
sleep 5
let totalTime-=5
pid=`head -n +1 $pidFile`