shell脚本探活

#!/bin/bash
# 定义变量
SERVER_NAME=$2
JAR_NAME="$SERVER_NAME.jar" # jar包名称
JAR_PATH="/mnt/data/ecch/$SERVER_NAME" # 当前 JAR 文件的路径
JAR_SOURCE_PATH=$3 # jenkins打包后的JAR 文件的路径
IP_PORT=$4 # 服务检测对应的ip和端口
BACKUP_DIR="$JAR_PATH/backup" # 备份目录
DATE=$(date +%Y%m%d%H%M) # 当前日期和时间
BACKUP_JAR="$JAR_NAME-$DATE.jar" # 备份文件名
MAX_CHECKS=15 # 最大检查次数
CHECK_INTERVAL=10 # 检查间隔时间
check_count=0 # 计数器
START_SH="${JAR_PATH}/start.sh" # 启动脚本
STATUS_CODE=-1 # 状态码
SERVICE_URL="http://$IP_PORT/actuator/health" # 健康检查的 URL
CURRENT_PID=$$ #当前执行脚本的pid

# 检测服务是否存活
is_service_alive() {
echo "进行服务状态检测: $SERVICE_URL"
STATUS_CODE=$(curl -o /dev/null -s -w "%{http_code}" $SERVICE_URL)
echo "response code $STATUS_CODE"
if [ "$STATUS_CODE" -eq 200 ]; then
return 0 # 服务存活
else
return 1 # 服务不存活
fi
}

# 备份文件
backup(){
echo "开始备份旧的 JAR 包..."
mkdir -p "$BACKUP_DIR"
cp "$JAR_PATH/$JAR_NAME" "$BACKUP_DIR/$BACKUP_JAR"
echo "备份完成: $BACKUP_JAR"
cd "$BACKUP_DIR" || exit
ls -tp *.jar | grep -v '/$' | tail -n +2 | xargs -I {} rm -- {}
echo "备份管理完成,最多保留最近一次的备份。"
}

#检查程序是否在运行
is_exist(){
pid=$(ps -ef | grep $JAR_NAME | grep -v grep | grep -v "$CURRENT_PID" | awk '{print $2}')
echo "获取到当前服务pid:$pid"
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}

#启动方法
start(){
echo "start...."
is_exist
if [ $? -eq 0 ]; then
echo "${JAR_NAME} is already running. pid=${pid}"
return 0
else
sh ${START_SH}
while [ $check_count -lt $MAX_CHECKS ]; do
is_service_alive
if [ $? -eq "0" ]; then
echo "服务存活,状态码: $STATUS_CODE"
break
else
echo "服务正在启动中....."
sleep $CHECK_INTERVAL
fi
check_count=$((check_count + 1))
done
if [ $check_count -eq $MAX_CHECKS ]; then
echo "${JAR_NAME} start fail"
return 1
else
return 0
fi
fi
}

#停止方法
stop(){
echo "stop ...."
is_exist
echo "stop pid:$pid"
if [ $? -eq "0" ]; then
kill $pid
while [ $check_count -lt $MAX_CHECKS ]; do
is_service_alive
is_exist
if [ $? -eq "0" ]; then
echo "服务存活,状态码: $STATUS_CODE"
sleep $CHECK_INTERVAL
else
echo "服务已停止,状态码: $STATUS_CODE"
break
fi
check_count=$((check_count + 1))
done
if [ $check_count -eq $MAX_CHECKS ]; then
echo "${JAR_NAME} stop fail"
return 1
else
return 0
fi
else
echo "${JAR_NAME} is not running"
return 0
fi
}

#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${JAR_NAME} is running. Pid is ${pid}"
else
echo "${JAR_NAME} is not running."
fi
}

#部署
deploy(){
stop
if [ $? -ne 0 ]; then
echo "停止服务失败,无法继续部署 ${JAR_NAME}."
exit 1 # 结束脚本执行
fi
# 备份
backup
# 更新jar
updateJar
sleep 1
start
if [ $? -ne 0 ]; then
echo "服务启动失败,部署失败 ${JAR_NAME}."
exit 1 # 结束脚本执行
fi
echo "${JAR_NAME} deploy success"
}

# jar包更新
updateJar(){
# 删除旧ar包
rm -rf ${JAR_PATH}/${JAR_NAME}
# 将jenkins打包好的文件放入
cp ${JAR_SOURCE_PATH}/${JAR_NAME} ${JAR_PATH}
}

#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"deploy")
deploy
;;
"pidExist")
is_exist
;;
"serverAlive")
is_service_alive
;;
"backup")
backup
;;
"updateJar")
updateJar
;;
*)
echo "Usage: $0 {start|stop|status|deploy} JAR_NAME JAR_PATH JAR_SOURCE_PATH IP_PORT"
;;
esac

posted @ 2025-08-07 16:17  人在代码在  阅读(15)  评论(0)    收藏  举报