You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本如何准确检测Tomcat服务的真实启动与停止状态

Tomcat 启停状态准确检测方案

原有逻辑的问题

  • 进程检测误差:原ps + grep的统计逻辑会把grep自身进程误算到统计结果中,单次检测也无法确认shutdown指令是否执行完成
  • 启动检测有效性低:仅判断进程存在无法确认应用初始化完成、端口正常监听、业务接口可对外响应

优化实现思路

停止状态准确检测

  1. 修正进程统计逻辑,过滤掉grep自身进程避免统计误差
  2. 增加轮询检测+超时机制,等待shutdown指令执行完成,超时后触发强制kill逻辑,保证进程完全退出

启动可用状态准确检测

  1. 优先检测业务自定义的健康检查接口,返回200状态码即代表服务完全可用
  2. 无健康接口的场景可替换为检测Tomcat监听端口是否正常、默认页面是否可访问
  3. 增加轮询检测+超时机制,适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:24:04