前提,必须保留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}秒"