ry.bat和ry.sh部署

这两个脚本是 RuoYi(若依)框架 提供的应用启动/管理脚本 ,分别用于 Windows(.bat)Linux/Mac(.sh) 系统。它们的作用是管理 Spring Boot 应用的启动、停止、重启和状态查询。

下面我逐个给你详细讲解。


一、ry.bat(Windows 批处理脚本)

1. 脚本结构概览

复制代码
设置变量 → 打印菜单 → 读取用户输入 → 跳转到对应功能 → 执行

2. 逐段详解

① 设置变量

batch 复制代码
set AppName=ruoyi-admin.jar
set JVM_OPTS="-Dname=%AppName% -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
  • AppName:要运行的 jar 包名称
  • JVM_OPTS:JVM 启动参数(内存、GC、时区、内存溢出时自动 dump 等)

② 打印菜单

batch 复制代码
ECHO.  [1] 启动%AppName%
ECHO.  [2] 关闭%AppName%
ECHO.  [3] 重启%AppName%
ECHO.  [4] 启动状态 %AppName%
ECHO.  [5] 退 出

显示一个交互菜单,让用户选择操作。

③ 读取用户输入并跳转

batch 复制代码
set /p ID=
IF "%id%"=="1" GOTO start
IF "%id%"=="2" GOTO stop
...

set /p 等待用户输入,然后根据输入跳转到对应的标签(:start:stop 等)。

:start --- 启动功能

batch 复制代码
:start
for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do (
    set pid=%%a
    set image_name=%%b
)
if defined pid (
    echo %%is running
    PAUSE
)
start javaw %JVM_OPTS% -jar %AppName%
echo Start %AppName% success...

执行流程

  1. jps -l 列出所有 Java 进程,用 findstr 过滤出包含 ruoyi-admin.jar 的进程
  2. 如果找到了(pid 已定义),提示正在运行并暂停
  3. 如果没有运行,用 start javaw 后台启动 jar 包(javaw 不显示命令行窗口)

:stop --- 关闭功能

batch 复制代码
:stop
for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %AppName%`) do (
    set pid=%%a
    set image_name=%%b
)
if not defined pid (
    echo process %AppName% does not exists
) else (
    taskkill /f /pid %pid%
)
  1. 查找进程
  2. 如果存在,用 taskkill /f /pid 强制杀死 进程(/f 是强制结束)

:restart --- 重启功能

batch 复制代码
:restart
call :stop
call :start

先调用关闭,再调用启动。

:status --- 状态查询

batch 复制代码
:status
for /f ... (查找进程)
if not defined pid (echo process is dead) else (echo is running)

3. Windows 脚本的局限性

问题 说明
jps 依赖 JDK 需要 JDK 的 jps 命令在 PATH 中,否则找不到进程
taskkill /f 强制杀死 不会给应用优雅关闭的机会(可能造成数据不一致)
交互式菜单 需要手动选择,不适合自动化部署(如 CI/CD)

二、ry.sh(Linux/Mac Shell 脚本)

1. 脚本结构概览

arduino 复制代码
设置变量 → 判断参数 → 定义函数 → case 匹配参数 → 执行对应函数

2. 逐段详解

① 设置变量

bash 复制代码
AppName=ruoyi-admin.jar
JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai ..."
APP_HOME=`pwd`
LOG_PATH=$APP_HOME/logs/$AppName.log

比 Windows 版本多了 APP_HOME(当前目录)和 LOG_PATH(日志路径),但注意脚本中实际把日志重定向到了 /dev/null(丢弃),所以 LOG_PATH 变量并未使用。

② 参数校验

bash 复制代码
if [ "$1" = "" ]; then
    echo "未输入操作名 {start|stop|restart|status}"
    exit 1
fi

必须带参数运行(如 ./ry.sh start),否则提示并退出。

start() 函数

bash 复制代码
function start()
{
    PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
    if [ x"$PID" != x"" ]; then
        echo "$AppName is running..."
    else
        nohup java $JVM_OPTS -jar $AppName > /dev/null 2>&1 &
        echo "Start $AppName success..."
    fi
}
  • ps -ef | grep ... 查找 Java 进程中包含 AppName 的进程号(PID)
  • 如果已经运行则提示,否则用 nohup ... & 后台启动
  • > /dev/null 2>&1 将标准输出和错误输出都丢弃(不写日志文件)

stop() 函数(优雅关闭)

bash 复制代码
function stop()
{
    PID=""
    query(){ PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`; }
    query
    if [ x"$PID" != x"" ]; then
        kill -TERM $PID        # 发送 SIGTERM 信号,让应用优雅关闭
        echo "$AppName (pid:$PID) exiting..."
        while [ x"$PID" != x"" ]  # 循环等待进程真正退出
        do
            sleep 1
            query
        done
        echo "$AppName exited."
    else
        echo "$AppName already stopped."
    fi
}

这是和 Windows 版本最大的区别

  • Linux 用 kill -TERM 发送终止信号,Spring Boot 会收到信号后执行优雅关闭(@PreDestroyShutdownHook 等)
  • Windows 用 taskkill /f 是强制杀死,不会触发优雅关闭

restart()status()

bash 复制代码
function restart() { stop; sleep 2; start; }
function status() { ... wc -l ... }  # 统计进程数判断是否运行

case 匹配

bash 复制代码
case $1 in
    start) start;;
    stop) stop;;
    restart) restart;;
    status) status;;
    *) ;;  # 其他参数不处理
esac

三、两个脚本的对比总结

维度 ry.bat (Windows) ry.sh (Linux/Mac)
交互方式 菜单选择(数字) 命令行参数(start/stop)
启动方式 start javaw nohup ... &
关闭方式 taskkill /f 强制杀死 kill -TERM 优雅关闭
进程检测 `jps -l findstr`
日志处理 默认输出到控制台 丢弃到 /dev/null
适用场景 本地开发测试 生产/测试服务器部署

四、使用示例

Windows(双击 ry.bat 或命令行运行)

cmd 复制代码
ry.bat
# 显示菜单,输入 1 启动,2 关闭,3 重启,4 查看状态,5 退出

Linux/Mac

bash 复制代码
./ry.sh start      # 启动
./ry.sh stop       # 停止(优雅关闭)
./ry.sh restart    # 重启
./ry.sh status     # 查看状态

五、脚本可以改进的地方

问题 改进建议
日志被丢弃ry.sh > /dev/null 改成 >> $LOG_PATH 保存日志
Windows 强制杀进程 可以用 taskkill /pid(不加 /f)尝试优雅关闭
没有 PID 文件 可以增加 PID 文件管理,避免 ps/grep 误判
重复代码 :start:status 都在查进程,可以抽取成公共函数

这两个脚本是典型的 Spring Boot 应用管理脚本,在中小型项目中很常见。如果你需要更专业的部署管理,可以考虑用 systemd (Linux)、Windows ServiceDocker/K8s。😊

相关推荐
mennekes2 小时前
自动化产线临时配电:明装工业插座 vs 面板式工业插座 vs 模块化插座箱取舍
运维·科技·安全·制造
tedcloud1232 小时前
book-to-skill 怎么部署?把技术书和项目文档变成 AI Agent 可复用知识
linux·运维·服务器·人工智能·开源
旗开得胜马到成功2 小时前
SK海力士SSD售后翻车:企业备份介质裸奔风险与中科热备技术选型拆解
运维·服务器·网络
7177772 小时前
厘清 Gitee Test 能力边界:测试管理、自动化与 DevSecOps 协同路径
运维·gitee·自动化
brian00313 小时前
虚拟机vmware文件的后缀名汇总介绍
运维·vmware·后缀名
2301_800954993 小时前
Linux 常用系统信息与进程管理命令速查
linux·运维·服务器
ITyunwei09873 小时前
CPU 100% 排查实战复盘:4步从确认到根治(附命令)
运维·企业微信
优化Henry4 小时前
学习笔记之爱立信站点指向证书执行
运维·服务器·网络·笔记·学习·信息与通信
智塑未来4 小时前
北京服务器托管选型:从机房位置到服务边界
运维·服务器