简单可靠的SpringBoot Jar包启动和更新的Shell脚本

能用脚本执行,就不用手动 nohup java -jar啦。

1.参数说明

最终代码实现如下,支持四个参数:
● operation:start-启动新包 / update-更新包
● env_para:指定使用哪个配置文件,如 test / prod / dev 等
● new_jar_package_name:新包的名称,这里必须要求 脚本的位置 在 新,旧包的同一目录下。
● old_jar_package_name::旧包的名称,要求同上

2.shell脚本

# !/bin/bash

# 检查命令行传入的参数
if [ -z "$1" ]; then
    echo "你必须输入操作类型(start 或 update)"
    exit 1
fi

# 检查新包的名称
if [ "$1" = "start" ] || [ "$1" = "update" ]; then
    if [ -z "$2" ]; then
        echo "你必须输入新的Jar包名称"
        exit 1
    fi
fi

operation=$1
env_para=$2
new_jar=$3
old_jar=$4

case $operation in
    start)
        # 启动新的Jar包
        source /etc/profile
        nohup java -jar -Duser.timezone=GMT+8 -Dspring.profiles.active=$env_para ./$new_jar >/dev/null 2>&1 &
        echo "新的Jar包已启动: $new_jar"
        ;;
    
    update)
        echo "更新新版本中..."
        
        # 查找老Jar包的进程并杀死它
        echo "正在终止旧的Jar包进程..."
        process_ids=$(pgrep -f $old_jar)
        
        if [ -n "$process_ids" ]; then
            for pid in $process_ids; do
                echo "杀死进程 $pid"
                sudo kill -9 $pid
            done
        fi
        # 等待4秒 
        echo "等待4秒"
        sleep 4
        
        # 启动新的Jar包
        source /etc/profile
        nohup java -jar -Duser.timezone=GMT+8 -Dspring.profiles.active=$env_para ./$new_jar >/dev/null 2>&1 &
        echo "新Jar包已启动: $new_jar"
        ;;
    
    *)
        echo "未知操作: $operation"
        echo "使用方法: ./deploy.sh [test|prod] [start|update] [new_jar_name] [old_jar_name_for_update]"
        exit 1
        ;;
esac

3.使用须知

脚本在复制到新环境之后,需要 chmod +x deploy.sh赋予一下执行权限

chmod +x deploy.sh
./deploy.sh update test new-springboot.jar old_springboot.jar

4.编写此类注意的坑

在写脚本的时候注意以下几点:
● 本脚本有很多来自通义大模型的帮助,很多复制内容,会出现文件从 Windows环境复制到Linux环境,可能存在文件换行符不匹配的情况,需要安装 dos2unix命令进行转换;
● 必须 循环遍历 process_ids 中的 pid,然后依次 kill;
● 必须在 kill 之后 sleep 4 和 source /etc/profile,否则只能正确kill 旧包,但是无法启动新包。这个坑只有亲身经历过才知道有多坑。

以上,如有帮助,请一键三联,如有问题,欢迎留言沟通

posted @ 2024-09-04 12:58  又一个蛇佬腔  阅读(19)  评论(0编辑  收藏  举报