tomcat按顺序启动应用

发布于:2024-04-17 ⋅ 阅读:(76) ⋅ 点赞:(0)

前提,必须保留tomcat自带的管理应用manager

#!/bin/bash
# 定义应用列表和对应的WAR文件路径
APPS=("app1" "app2" "app3")
# tomcat目录
TOMCAT_HOME=/app/apache-tomcat-8.5.99
# tomcat地址
TOMCAT_HOST="http://127.0.0.1:8085"
# Tomcat Manager的URL
MANAGER_URL="${TOMCAT_HOST}/manager/text/list"
# 定义部署URL
DEPLOY_URL_BASE="${TOMCAT_HOST}/manager/text/deploy?path=/"
# war包路径
WARFILE_PATH="/app/wars"
# Tomcat Manager的用户名和密码
USERNAME="tomcat"
PASSWORD="tomcat"
# 检查状态的间隔(秒)
CHECK_INTERVAL=1
# 最大等待时间(秒)
MAX_WAIT_TIME=30
# 开始时间
START_TIME=$(date +%s)
# 当前等待时间
CURRENT_WAIT_TIME=0
#shell执行总耗时
SHELL_START_TIME=$(date +%s%N)
# 检查是否提供了参数
if [ "$#" -ne 1 ]; then
    echo "$(date +"%Y-%m-%d %H:%M:%S") 必须携带参数,例如:all"
    exit 1
else
    if [ "$1" != "all" ]; then
       # 如果参数不是 "all",则只使用指定的应用
       APPS=("$1")
    fi
fi
./stop.sh
#启动tomcat
sh "${TOMCAT_HOME}/bin/startup.sh"
START_TIME=$(date +%s)
while true; do
    #判断tomcat是否启动成功
    CURRENT_TIME=$(date +%s)
    CURRENT_WAIT_TIME=$(( CURRENT_TIME - START_TIME ))
    curl -s -o /dev/null "$TOMCAT_HOST"
    if [ $? -ne 0 ]; then
        if (( CURRENT_WAIT_TIME >= MAX_WAIT_TIME )); then
            echo "$(date +"%Y-%m-%d %H:%M:%S") 已超过最大等待时间。tomcat主服务${TOMCAT_HOST}未能启动完成。"
            exit 1
        fi
    else
        echo "$(date +"%Y-%m-%d %H:%M:%S") tomcat主服务${TOMCAT_HOST}启动完成。"
        break
    fi
    echo "$(date +"%Y-%m-%d %H:%M:%S") 等待tomcat主服务启动... ($CURRENT_WAIT_TIME/$MAX_WAIT_TIME)"
    sleep $CHECK_INTERVAL
done

# 函数:检查应用状态
check_app_status() {
    local RESPONSE=$(curl -s -u "$USERNAME:$PASSWORD" "$MANAGER_URL")
    local IS_ALL_RUNNING=0
    # 解析响应并检查每个应用的状态
    while IFS= read -r line; do
        if [[ $line =~ /(.*):(.*):(.*):(.*) ]]; then
            # /:running:0:ROOT
            local app_status="${BASH_REMATCH[2]}"
            local app_path="${BASH_REMATCH[4]}"
            # echo "BASH_REMATCH arr  ${#BASH_REMATCH[@]}"  #BASH_REMATCH arr  5
            # echo "BASH_REMATCH0  ${BASH_REMATCH[0]}"      #BASH_REMATCH0  /manager:running:0:manager
            # echo "BASH_REMATCH1  ${BASH_REMATCH[1]}"      #BASH_REMATCH1  manager
            # echo "BASH_REMATCH2  ${BASH_REMATCH[2]}"      #BASH_REMATCH2  running
            # echo "BASH_REMATCH3  ${BASH_REMATCH[3]}"      #BASH_REMATCH3  0
            # echo "BASH_REMATCH4  ${BASH_REMATCH[4]}"      #BASH_REMATCH4  manager
            # echo "app_path  $app_path"
            # echo "app_status  $app_status"
            # echo "while  $line"
            # 打印应用状态
            app_path=$(echo -e "${app_path}" | tr -d '\r')
            app_status=$(echo -e "${app_status}" | tr -d '\r')
            echo "$(date +"%Y-%m-%d %H:%M:%S") tomcat基础应用 $app_path 状态为 $app_status"

            # 如果应用不是running状态,设置标志并退出循环
            if [[ $app_status != "running" && ( $app_path == "ROOT" || $app_path == "manager" || $app_path == "examples" || $app_path == "host-manager" || $app_path == "docs" ) ]]; then
                IS_ALL_RUNNING=1
                break
            fi
        fi
    done <<< "$RESPONSE"

    return $IS_ALL_RUNNING
}

# 循环检查应用状态,直到所有应用都运行或超过最大等待时间
while true; do
    if check_app_status; then
        echo "$(date +"%Y-%m-%d %H:%M:%S") 成功启动所有tomcat基础应用程序!"
        break
    else
        CURRENT_TIME=$(date +%s)
        CURRENT_WAIT_TIME=$(( CURRENT_TIME - START_TIME ))
        if (( CURRENT_WAIT_TIME >= MAX_WAIT_TIME )); then
            echo "$(date +"%Y-%m-%d %H:%M:%S") 已超过最大等待时间。未能成功启动所有tomcat基础应用程序。"
            exit 1
        fi
        echo "$(date +"%Y-%m-%d %H:%M:%S") 等待tomcat基础应用程序启动... ($CURRENT_WAIT_TIME/$MAX_WAIT_TIME)"
        sleep $CHECK_INTERVAL
    fi
done


# 部署单个应用的函数
deploy_app() {
    local app_name=$1
    local war_path=$2
    echo "$(date +"%Y-%m-%d %H:%M:%S") 进入deploy_app函数:应用名称=$app_name, WAR文件路径=$war_path"

    local deploy_url="${DEPLOY_URL_BASE}${app_name}&war=file:${war_path}"

    echo "$(date +"%Y-%m-%d %H:%M:%S") 正在部署 ${app_name}..."
    START_TIME=$(date +%s%N)
    # 执行curl命令并检查输出中是否包含成功消息
    # OK - 以应用path [/irs] 部署应用
    # OK - Deployed application at context path [/sds]
    # if curl -u "$USERNAME:$PASSWORD" -s "${deploy_url}" | grep -q "OK - 以应用path \\[/${app_name}\\] 部署应用"; then
    if curl -u "$USERNAME:$PASSWORD" -s "${deploy_url}" | grep -q "OK - Deployed application at context path \\[/${app_name}\\]"; then
        #纳秒
        END_TIME=$(date +%s%N)
        TAKE=$(echo "scale=2; ($END_TIME - $START_TIME) / 1000000 / 1000" | bc)
        echo "$(date +"%Y-%m-%d %H:%M:%S") ${app_name} 部署成功!耗时:${TAKE}秒"
        return 0  # 部署成功,返回0
    else
        echo "$(date +"%Y-%m-%d %H:%M:%S") 部署 ${app_name} 失败"
        return 1  # 部署失败,返回非0值
    fi
}

# 打印应用列表
echo "$(date +"%Y-%m-%d %H:%M:%S") 准备部署${APPS[@]}"
# 遍历应用列表并依次部署
for app_name in "${APPS[@]}"; do
    war_path="${WARFILE_PATH}/${app_name}.war"
    echo "$(date +"%Y-%m-%d %H:%M:%S") 正在从 ${war_path} 部署 ${app_name}..."

    # 调用deploy_app函数并检查其返回值
    if ! deploy_app "$app_name" "$war_path"; then
        echo "$(date +"%Y-%m-%d %H:%M:%S") 部署 ${app_name} 失败。脚本终止执行。"
        exit 1  # 部署失败,终止脚本执行
    fi
done
SHELL_END_TIME=$(date +%s%N)
SHELL_TAKE=$(echo "scale=2; ($SHELL_END_TIME - $SHELL_START_TIME) / 1000000 / 1000" | bc)
echo "$(date +"%Y-%m-%d %H:%M:%S") 所有应用均已成功部署。shell执行总耗时:${SHELL_TAKE}秒"

卸载单个应用

#!/bin/bash
# 定义应用列表和对应的WAR文件路径
APPS=("app1" "app2" "app3")
# tomcat目录
TOMCAT_HOME=/app/apache-tomcat-8.5.99
# tomcat地址
TOMCAT_HOST="http://127.0.0.1:8085"
# 定义卸载URL
UNDEPLOY_URL_BASE="${TOMCAT_HOST}/manager/text/undeploy?path=/"
# Tomcat Manager的用户名和密码
USERNAME="tomcat"
PASSWORD="tomcat"
# 开始时间
START_TIME=$(date +%s)
#shell执行总耗时
SHELL_START_TIME=$(date +%s%N)
# 检查是否提供了参数
if [ "$#" -ne 1 ]; then
    echo "$(date +"%Y-%m-%d %H:%M:%S") 必须携带参数,例如:all"
    exit 1
else
    if [ "$1" != "all" ]; then
       # 如果参数不是 "all",则只使用指定的应用
       APPS=("$1")
    fi
fi


# 卸载单个应用的函数
undeploy_app() {
    local app_name=$1
    echo "$(date +"%Y-%m-%d %H:%M:%S") 进入undeploy_app函数:应用名称=$app_name"

    local undeploy_url="${UNDEPLOY_URL_BASE}${app_name}"

    echo "$(date +"%Y-%m-%d %H:%M:%S") 正在卸载 ${app_name}..."
    START_TIME=$(date +%s%N)
    # 执行curl命令并检查输出中是否包含成功消息:
    # OK - 未部署的应用位于上下文路径[/irs]
    # OK - Undeployed application at context path [/sds]
    # if curl -u "$USERNAME:$PASSWORD" -s "${undeploy_url}" | grep -q "OK - 未部署的应用位于上下文路径\\[/${app_name}\\]"; then
    if curl -u "$USERNAME:$PASSWORD" -s "${undeploy_url}" | grep -q "OK - Undeployed application at context path \\[/${app_name}\\]"; then
        #纳秒
        END_TIME=$(date +%s%N)
        TAKE=$(echo "scale=2; ($END_TIME - $START_TIME) / 1000000 / 1000" | bc)
        echo "$(date +"%Y-%m-%d %H:%M:%S") ${app_name} 卸载成功!耗时:${TAKE}秒"
        return 0  # 卸载成功,返回0
    else
        echo "$(date +"%Y-%m-%d %H:%M:%S") 卸载 ${app_name} 失败"
        return 1  # 卸载失败,返回非0值
    fi
}

# 打印应用列表
echo "$(date +"%Y-%m-%d %H:%M:%S") 卸载${APPS[@]}"
# 遍历应用列表并依次卸载
for app_name in "${APPS[@]}"; do
    # 调用undeploy_app函数并检查其返回值
    if ! undeploy_app "$app_name"; then
        echo "$(date +"%Y-%m-%d %H:%M:%S") 卸载 ${app_name} 失败。脚本终止执行。"
        #exit 1  # 卸载失败,终止脚本执行
    fi
done
SHELL_END_TIME=$(date +%s%N)
SHELL_TAKE=$(echo "scale=2; ($SHELL_END_TIME - $SHELL_START_TIME) / 1000000 / 1000" | bc)
echo "$(date +"%Y-%m-%d %H:%M:%S") 应用已成功卸载。shell执行总耗时:${SHELL_TAKE}秒"