Bash脚本如何准确检测Tomcat服务的真实启动与停止状态
Tomcat 启停状态准确检测方案
原有逻辑的问题
- 进程检测误差:原
ps + grep的统计逻辑会把grep自身进程误算到统计结果中,单次检测也无法确认shutdown指令是否执行完成 - 启动检测有效性低:仅判断进程存在无法确认应用初始化完成、端口正常监听、业务接口可对外响应
优化实现思路
停止状态准确检测
- 修正进程统计逻辑,过滤掉grep自身进程避免统计误差
- 增加轮询检测+超时机制,等待shutdown指令执行完成,超时后触发强制kill逻辑,保证进程完全退出
启动可用状态准确检测
- 优先检测业务自定义的健康检查接口,返回200状态码即代表服务完全可用
- 无健康接口的场景可替换为检测Tomcat监听端口是否正常、默认页面是否可访问
- 增加轮询检测+超时机制,适配Tomcat从进程启动到服务可用的初始化耗时
改造后完整脚本
# 进程状态检测:过滤grep进程,避免统计误差 tc_status () { ps aux | grep "myapp123" | grep -v "grep" | wc -l } # 服务可用性检测:可根据实际场景替换检测逻辑 tc_service_available() { # 方案1:优先使用业务自定义健康接口(推荐,最准确) curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080/your-health-path | grep -q "200" # 方案2:无健康接口时检测端口是否监听(替换为实际Tomcat端口) # nc -z 127.0.0.1 8080 # 方案3:检测Tomcat默认页面响应状态 # curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080 | grep -q "200" return $? } # 停止Tomcat逻辑 if [ $(tc_status) -gt 0 ]; then echo "Stopping Tomcat" /home/user/shutdown.sh myapp123 > /dev/null 2>&1 # 最多等待30秒让Tomcat正常停止 STOP_TIMEOUT=30 STOP_COUNTER=0 while [ $(tc_status) -gt 0 ] && [ ${STOP_COUNTER} -lt ${STOP_TIMEOUT} ]; do sleep 1 STOP_COUNTER=$((STOP_COUNTER+1)) done # 超时后强制杀死进程 if [ $(tc_status) -gt 0 ]; then echo "Tomcat 正常停止超时,执行强制 kill" ps aux | grep "myapp123" | grep -v "grep" | awk '{print $2}' | xargs kill -9 > /dev/null 2>&1 sleep 2 fi echo "Tomcat 已完全停止" fi # 其他自定义业务逻辑 # ... # 启动Tomcat逻辑 echo "Starting Tomcat..." /home/user/startup.sh myapp123 > /dev/null 2>&1 # 最多等待300秒检测服务可用性,可根据应用启动速度调整 START_TIMEOUT=300 START_COUNTER=0 while ! tc_service_available && [ ${START_COUNTER} -lt ${START_TIMEOUT} ]; do sleep 3 START_COUNTER=$((START_COUNTER+3)) done if tc_service_available; then echo "OK! Tomcat 服务已正常可用" else echo "ERROR! Tomcat 启动超时,服务未正常可用" exit 1 fi
可调整配置说明
- 超时时间:
STOP_TIMEOUT停止超时、START_TIMEOUT启动超时可根据业务实际运行情况调整 - 检测逻辑:
tc_service_available中的检测方式可根据自身环境灵活选择,没有curl、nc命令可以替换为对应系统下的检测命令
内容的提问来源于stack exchange,提问作者ng-User
相关产品推荐
相关产品推荐

