简单可靠的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 旧包,但是无法启动新包。这个坑只有亲身经历过才知道有多坑。
以上,如有帮助,请一键三联,如有问题,欢迎留言沟通