linux常规(shell脚本)-启动java程序-实现快捷git拉取,maven打包,nohup发布(无dockerfile版)

全文目录,一步到位

  • 1.前言简介
    • [1.1 专栏传送门](#1.1 专栏传送门)
  • [2. 启动的sh脚本大全](#2. 启动的sh脚本大全)
    • [2.1 停止服务`stop.sh`脚本 (可独立运行)](#2.1 停止服务stop.sh脚本 (可独立运行))
    • [2.2 重启服务`restart.sh`(双版本)](#2.2 重启服务restart.sh(双版本))
    • [2.3 打版发布脚本`issue.sh`(`不可`单独执行)](#2.3 打版发布脚本issue.sh(不可单独执行))
    • [2.4 前置准备工作](#2.4 前置准备工作)
  • [3. 文章的总结与预告](#3. 文章的总结与预告)
    • [3.1 本文总结](#3.1 本文总结)

1.前言简介

最近弄内网服务器, 就算部署jenkins也没啥用, 登录堡垒机, 并且项目是个单体, 那就弄个能自动拉取 打版发布的功能就行了

1.1 专栏传送门

2. 启动的sh脚本大全

补充一下 没有权限 就 在sh脚本路径下执行指令 , 或者输入名字替换*

bash 复制代码
chmod +x *.sh

*** 注意, 下面的脚本用的时候 更换一下目录 ***

2.1 停止服务stop.sh脚本 (可独立运行)

复制代码
# 脚本名称:stop.sh
#
# @author: pzy 
# @data: 2025/12/04
#
# 功能:单独停止ruoyi-admin服务(关闭旧进程)
#
# 可独立执行:./stop.sh
bash 复制代码
#!/bin/bash
#
# 脚本名称:stop.sh
#
# @author: pzy 
# @data: 2025/12/04
#
# 功能:单独停止ruoyi-admin服务(关闭旧进程)
#
# 可独立执行:./stop.sh

# ======================== 配置项========================
WORK_DIR="/usr/local/src/docker/jar/zhengwu/e-commerce"       # 项目根目录
JAR_DIR="${WORK_DIR}/ruoyi-admin/target"                      # JAR包所在目录
JAR_FILE="${JAR_DIR}/ruoyi-admin.jar"                         # 目标JAR包路径
# =============================================================================

# 错误提示函数(红色字体)
error_exit() {
    echo -e "\033[31m[ERROR] $1\033[0m" >&2
    exit 1
}

# 成功提示函数(绿色字体)
success_echo() {
    echo -e "\033[32m[SUCCESS] $1\033[0m"
}

# 信息提示函数(蓝色字体)
info_echo() {
    echo -e "\033[34m[INFO] $1\033[0m"
}

# ======================== check ========================
# 检查JAR文件路径是否存在(即使JAR没启动,也允许执行停止操作)
if [ ! -d "${JAR_DIR}" ]; then
    error_exit "JAR目录 ${JAR_DIR} 不存在,请检查路径是否正确!"
fi

# ======================== 查找并关闭旧进程 ========================
info_echo "查找ruoyi-admin.jar的运行进程..."
OLD_PID=$(ps aux | grep "${JAR_FILE}" | grep -v grep | awk '{print $2}')

if [ -z "${OLD_PID}" ]; then
    success_echo "未找到ruoyi-admin.jar的运行进程,无需停止"
    exit 0
fi

# 存在进程,执行关闭逻辑
info_echo "找到ruoyi-admin.jar进程PID:${OLD_PID},开始停止..."
# 第一步:尝试正常关闭(优雅退出)
if kill "${OLD_PID}"; then
    # 等待3秒,检查进程是否已关闭
    sleep 3
    if ps -p "${OLD_PID}" > /dev/null 2>&1; then
        info_echo "进程${OLD_PID}未正常退出,执行强制杀死(kill -9)..."
        kill -9 "${OLD_PID}" || error_exit "强制杀死进程${OLD_PID}失败!"
        success_echo "进程${OLD_PID}已强制关闭"
    else
        success_echo "进程${OLD_PID}已正常关闭"
    fi
else
    error_exit "尝试关闭进程${OLD_PID}失败!请手动检查进程状态"
fi

success_echo "ruoyi-admin服务停止完成!"
exit 0

2.2 重启服务restart.sh(双版本)

=> 2.2.1 不可单独运行版本 需要依赖于stop.sh

java 复制代码
#!/bin/bash
#
# 脚本名称:restart.sh
#
# @author: pzy 
# @data: 2025/12/04
#
# 功能:单独重启ruoyi-admin服务(关闭旧进程+启动新进程)
#
# 可独立执行:./restart.sh
# 
# 依赖文件: ./stop.sh

# ======================== 配置项 ========================
WORK_DIR="/usr/local/src/docker/jar/zhengwu/e-commerce"       # 项目根目录
JAR_DIR="${WORK_DIR}/ruoyi-admin/target"                      # JAR包所在目录
JAR_FILE="${JAR_DIR}/ruoyi-admin.jar"                         # 目标JAR包路径
SH_WORK_DIR="/usr/local/src/docker/jar/zhengwu"               # 脚本存放位置
STOP_SCRIPT="${SH_WORK_DIR}/stop.sh"                          # 停止脚本路径
LOG_FILE="${SH_WORK_DIR}/nohup.log"                           # 应用日志文件路径(存到脚本路径下)
# =============================================================================

# 错误提示函数(红色字体)
error_exit() {
    echo -e "\033[31m[ERROR] $1\033[0m" >&2
    exit 1
}

# 成功提示函数(绿色字体)
success_echo() {
    echo -e "\033[32m[SUCCESS] $1\033[0m"
}

# 信息提示函数(蓝色字体)
info_echo() {
    echo -e "\033[34m[INFO] $1\033[0m"
}

# ======================== check ========================
# 检查JAR目录是否存在
if [ ! -d "${JAR_DIR}" ]; then
    error_exit "JAR目录 ${JAR_DIR} 不存在,请检查打包是否成功!"
fi

# 检查JAR文件是否存在
if [ ! -f "${JAR_FILE}" ]; then
    error_exit "JAR文件 ${JAR_FILE} 不存在,请先执行mvn打包!, 执行issue_zhengwu.sh即可"
fi

# ======================== 查找并关闭旧进程 ========================
info_echo "开始停止ruoyi-admin旧服务(调用 ${STOP_SCRIPT})..."
if ! "${STOP_SCRIPT}"; then
    error_exit "停止旧服务失败!请手动执行 ${STOP_SCRIPT} 检查问题"
fi

# ======================== 启动新进程 ========================
info_echo "启动ruoyi-admin.jar,日志将输出到 ${LOG_FILE}"
# 清空旧日志 (留 注释即可)
> "${LOG_FILE}"
# 后台启动JAR包,并重定向日志(stdout/stderr都写入日志)
nohup java -jar "${JAR_FILE}" > "${LOG_FILE}" 2>&1 &
NEW_PID=$!  # 获取新进程PID

# 验证进程是否启动成功
sleep 2  # 等待2秒让进程稳定
if ps -p "${NEW_PID}" > /dev/null 2>&1; then
    success_echo "ruoyi-admin服务重启成功!"
    success_echo "新进程PID:${NEW_PID}"
    success_echo "应用日志路径:${LOG_FILE}"
else
    error_exit "ruoyi-admin服务启动失败!请查看日志 ${LOG_FILE}"
fi

exit 0

=> 2.2.2 可单独运行版本

找到 查找并关闭旧进程

---> 替换成这个即可

启动新进程之前

bash 复制代码
info_echo "查找ruoyi-admin.jar的旧进程..."
OLD_PID=$(ps aux | grep "${JAR_FILE}" | grep -v grep | awk '{print $2}')
if [ -n "${OLD_PID}" ]; then
    info_echo "找到旧进程PID:${OLD_PID},正在关闭..."
    # 尝试正常关闭进程
    if kill "${OLD_PID}"; then
        # 等待3秒,检查进程是否关闭
        sleep 3
        if ps -p "${OLD_PID}" > /dev/null 2>&1; then
            info_echo "旧进程${OLD_PID}未正常关闭,执行强制杀死..."
            kill -9 "${OLD_PID}" || error_exit "强制杀死旧进程${OLD_PID}失败!"
        fi
        success_echo "旧进程${OLD_PID}已成功关闭"
    else
        error_exit "关闭旧进程${OLD_PID}失败!"
    fi
else
    info_echo "未找到ruoyi-admin.jar的旧进程,无需关闭"
fi

2.3 打版发布脚本issue.sh(不可单独执行)

需要依赖上面两个脚本

功能:

  1. 自动化拉取代码

  2. maven编译打包

  3. 成功后调用restart.sh重启服务
    注意事项:

  4. 需要首先git clone拉取代码(并且配置好账号密码/密钥等)
    依赖文件:

  5. ./stop.sh

  6. ./restart.sh

bash 复制代码
#!/bin/bash
# 
# @author: pzy 
# @data: 2025/12/04
#
# 功能:
# 1. 自动化拉取代码
# 2. 编译打包
# 3. 成功后调用restart.sh重启服务
#
# 注意事项: 
# 需要首先git clone拉取代码(并且配置好账号密码/密钥等)
#
# 依赖文件: 
# ./stop.sh
# ./restart.sh

# ======================== 配置项 ========================
WORK_DIR="/usr/local/src/docker/jar/zhengwu/e-commerce"       # 项目根目录
SH_WORK_DIR="/usr/local/src/docker/jar/zhengwu"               # 脚本存放位置
MAVEN_PATH="/usr/local/src/apache-maven-3.6.3/bin/mvn"        # mvn执行路径
RESTART_SCRIPT="${SH_WORK_DIR}/restart.sh"                    # 重启脚本路径
# =============================================================================

# 错误提示函数(红色字体)
error_exit() {
    echo -e "\033[31m[ERROR] $1\033[0m" >&2
    exit 1
}

# 成功提示函数(绿色字体)
success_echo() {
    echo -e "\033[32m[SUCCESS] $1\033[0m"
}

# 信息提示函数(蓝色字体)
info_echo() {
    echo -e "\033[34m[INFO] $1\033[0m"
}

# ======================== 步骤1:进入项目目录 ========================
info_echo "开始执行步骤1:进入项目目录 ${WORK_DIR}"
if [ ! -d "${WORK_DIR}" ]; then
    error_exit "项目目录 ${WORK_DIR} 不存在,请检查路径是否正确!"
fi

cd "${WORK_DIR}" || error_exit "进入目录 ${WORK_DIR} 失败,请检查目录权限!"
success_echo "步骤1执行完成:已进入目录 ${WORK_DIR}"

# ======================== 步骤2:拉取Git代码 ========================
info_echo "开始执行步骤2:拉取Git最新代码"
if ! git pull; then
    error_exit "步骤2执行失败:git pull 拉取代码失败!"
fi
success_echo "步骤2执行完成:Git代码拉取成功"

# ======================== 步骤3:Maven编译打包 ========================
info_echo "开始执行步骤3:Maven clean install 编译打包"
if ! "${MAVEN_PATH}" clean install; then
    error_exit "步骤3执行失败:mvn clean install 编译打包失败!"
fi
success_echo "步骤3执行完成:Maven编译打包成功"

# ======================== 步骤4:调用独立的重启脚本 ========================
info_echo "开始执行步骤4:调用重启脚本 ${RESTART_SCRIPT}"
# 检查重启脚本是否存在且可执行
if [ ! -f "${RESTART_SCRIPT}" ]; then
    error_exit "重启脚本 ${RESTART_SCRIPT} 不存在!"
fi
if [ ! -x "${RESTART_SCRIPT}" ]; then
    info_echo "重启脚本缺少执行权限,自动添加..."
    chmod +x "${RESTART_SCRIPT}" || error_exit "添加重启脚本执行权限失败!"
fi

# 执行重启脚本,并检查执行结果
if "${RESTART_SCRIPT}"; then
    success_echo "所有步骤执行完成!代码拉取、打包、服务重启均成功"
else
    error_exit "步骤4执行失败:调用重启脚本 ${RESTART_SCRIPT} 失败!"
fi

exit 0

2.4 前置准备工作

git 得有 先git clone执行一下 把项目拉去下来(记得把账号密码都放入到链接中,或者密钥等)

装一个maven maven配置一下settings.xml , 设置一下本地仓库地址

3. 文章的总结与预告

3.1 本文总结

实现简易的代码拉取-> 打包 -> 发布的 简单脚本, 小功能省略装jenkins


@author: pingzhuyan
@description: ok
@year: 2024

相关推荐
李贺梖梖42 分钟前
day06 二维数组、Arrays、System、HuTool、方法
java
小股虫43 分钟前
idea编译内存溢出 java: java.lang.OutOfMemoryError: WrappedJavaFileObject[ 解决方案
java·ide·intellij-idea·idea
幸福右手牵43 分钟前
交换机的层数的含义(二层、三层)
linux·服务器·网络·智能路由器
U***746944 分钟前
三大框架-Spring
java·spring·rpc
南部余额1 小时前
深度解析 Spring @Conditional:实现智能条件化配置的利器
java·后端·spring·conditional
java_logo1 小时前
GITLAB Docker 容器化部署指南
linux·运维·数据库·docker·容器·eureka·gitlab
计算机毕设指导61 小时前
基于Springboot+微信小程序流浪动物救助管理系统【源码文末联系】
java·spring boot·后端·spring·微信小程序·tomcat·maven
刘晓倩1 小时前
Python的re
java·python·mysql
阿雄不会写代码1 小时前
PPTX数据格式的更换图片
linux·运维·服务器