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


1.前言简介

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

1.1 专栏传送门

2. 启动的sh脚本大全

在这里插入图片描述

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

chmod +x *.sh

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

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

# 脚本名称:stop.sh
#
# @author: pzy
# @data: 2025/12/04
#
# 功能:单独停止ruoyi-admin服务(关闭旧进程)
#
# 可独立执行:./stop.sh
#!/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

#!/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 可单独运行版本

找到 查找并关闭旧进程
—> 替换成这个即可
启动新进程之前

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重启服务

注意事项:

  1. 需要首先git clone拉取代码(并且配置好账号密码/密钥等)

依赖文件:

  1. ./stop.sh
  2. ./restart.sh
#!/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

posted @ 2026-01-09 21:25  clnchanpin  阅读(15)  评论(0)    收藏  举报