背景:
因服务上部署10-20个java应用,频繁更新应用容易损坏女朋友,特勉勉强强编写一个自动更新脚本。(还需完善)
可参考写法,部分还需优化
#!/bin/bash
set -o pipefail
declare -r BAK_TIME=$(date +%y%m%d)
#升级文件上传minio桶中,定义minio upgrade桶的路径
declare -r MINIO_PID=$(pgrep minio)
declare -r SRC_PATH="$(ps -ef | grep $MINIO_PID | grep -v "grep" |awk '{print $NF}')/upgrade"
#定义了部署的jar包
SERVICE=("A.jar" "B.jar" "C.jar")
#定义了前端文件位置,待优化
declare -r FRONTNM="web.zip"
declare -r FRONT_PATH="/data/"
#定义数组,存储minio桶中更新的文件
global_svcs=()
#创建检查服务的函数
function check_service() {
local SERVICES_NAME=$1
if ps -ef | grep "SERVICES_NAME" | grep -v "grep" |awk 'NR==1{print $2}' >/dev/null ;then
echo "$SERVICES_NAME 服务正在运行" && sleep 1
return 0
else
echo "$SERVICES_NAME 服务未运行,脚本将退出" && sleep 1
exit 1
return 1
fi
}
#创建函数
function check_upgrade_service() {
local SERVICES_NAME=$1
if [ -f $SRC_PATH/$SERVICES_NAME];then
global_svcs+=("$SERVICES_NAME")
return 0
fi
}
#创建升级服务的函数
function upgrade_service() {
local SERVICES_NAME=$1
local PID=$(ps -ef | grep "SERVICES_NAME" | grep -v "grep" |awk 'NR==1{print $2}')
if [ -f $SRC_PATH/$SERVICES_NAME ];then
echo "备份 $SERVICES_NAME 应用包" && sleep 3
cd /proc/$PID/cwd
mv $(grep . -l *.jar) ./$(grep . -l *.jar)-$BAK_TIME
echo "停止运行 $SERVICES_NAME" && sleep 3
kill -9 $PID
echo "" > nohup.out
mv $SRC_PATH/$SERVICES_NAME .
nohup java -Xmx4g -Xms4g -jar A.jar &
sleep 3
return 0
else
echo "程序存在问题,退出当前脚本" && sleep 2
return 1
fi
}
#创建升级服务的函数
function upgrade_front_service() {
if [ -f $SRC_PATH/$SERVICES_NAME ];then
echo "正在替换前端文件,备份旧包" && sleep 2
cd $FRONT_PATH
mv -f web ./web-$BAK_TIME
mv $SRC_PATH/$FRONTNM .
unzip $FRONT_PATH > /dev/null
echo "前端升级完成" && sleep 2
else
echo "前端无需升级" && sleep 2
fi
}
#调用函数--检测服务运行情况
echo "检测服务运行情况"
for service in "${SERVICE[@]}";do
check_service "$service"
done
#调用函数--前端升级
upgrade_front_service
#调用函数--检查升级文件
for service in "${SERVICE[@]}";do
check_upgrade_service "$service"
done
if [ "$(ls -A "$SRC_PATH")" ];then
echo "检测此次升级包含的后端文件 ${global_svcs[@]}"
else
echo "检测此次升级不涉及后端文件"
exit 1
fi
#调用函数--后端升级
for service in "${global_svcs[@]}";do
upgrade_service "$service"
done