Files
2025-08-31 19:38:31 +08:00

297 lines
8.1 KiB
Batchfile

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
REM 多实例启动脚本 (Windows版本)
REM 使用方法: start-multi-instance.bat [start|stop|restart|status] [instance_name]
REM 实例名称: 9900, 9901, 9902, 9903, all
REM 配置变量
set JAR_NAME=ruoyi-admin.jar
set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m
set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai
set JAVA_OPTS=%JAVA_OPTS% -XX:+UseG1GC -XX:MaxGCPauseMillis=200
set JAVA_OPTS=%JAVA_OPTS% -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs\
REM 日志目录
if not exist logs mkdir logs
REM 颜色输出函数
:print_message
set color=%1
set message=%2
if "%color%"=="RED" (
echo [31m%message%[0m
) else if "%color%"=="GREEN" (
echo [32m%message%[0m
) else if "%color%"=="YELLOW" (
echo [33m%message%[0m
) else (
echo %message%
)
goto :eof
REM 检查JAR文件是否存在
:check_jar
if not exist "%JAR_NAME%" (
call :print_message RED "错误: %JAR_NAME% 文件不存在!"
call :print_message YELLOW "请确保在正确的目录下运行此脚本,或先执行 mvn clean package -Pprod 编译项目"
pause
exit /b 1
)
goto :eof
REM 启动单个实例
:start_instance
set port=%1
set profile=%2
set pid_file=logs\ruoyi-admin-%port%.pid
set log_file=logs\ruoyi-admin-%port%.log
REM 检查是否已经运行
if exist "%pid_file%" (
for /f "tokens=*" %%i in (%pid_file%) do set pid=%%i
tasklist /FI "PID eq !pid!" 2>nul | find /I "!pid!" >nul
if !errorlevel! equ 0 (
call :print_message YELLOW "实例 %port% 已经在运行中 (PID: !pid!)"
goto :eof
) else (
REM PID文件存在但进程不存在,清理PID文件
del "%pid_file%" 2>nul
)
)
call :print_message GREEN "正在启动实例 %port% (配置文件: %profile%)..."
REM 启动应用
start /b java %JAVA_OPTS% -Dspring.profiles.active=%profile% -Dserver.port=%port% -jar %JAR_NAME% > "%log_file%" 2>&1
REM 等待启动
timeout /t 3 /nobreak >nul
REM 查找新启动的进程
for /f "tokens=2" %%i in ('tasklist /FI "IMAGENAME eq java.exe" /FO CSV ^| findstr /I "java.exe"') do (
set new_pid=%%i
set new_pid=!new_pid:"=!
echo !new_pid! > "%pid_file%"
call :print_message GREEN "实例 %port% 启动成功 (PID: !new_pid!)"
call :print_message GREEN "访问地址: http://localhost:%port%"
call :print_message GREEN "日志文件: %log_file%"
goto :eof
)
call :print_message RED "实例 %port% 启动失败,请检查日志文件: %log_file%"
if exist "%pid_file%" del "%pid_file%"
goto :eof
REM 停止单个实例
:stop_instance
set port=%1
set pid_file=logs\ruoyi-admin-%port%.pid
if exist "%pid_file%" (
for /f "tokens=*" %%i in (%pid_file%) do set pid=%%i
tasklist /FI "PID eq !pid!" 2>nul | find /I "!pid!" >nul
if !errorlevel! equ 0 (
call :print_message YELLOW "正在停止实例 %port% (PID: !pid!)..."
taskkill /PID !pid! /F >nul 2>&1
del "%pid_file%" 2>nul
call :print_message GREEN "实例 %port% 已停止"
) else (
call :print_message YELLOW "实例 %port% 未运行"
del "%pid_file%" 2>nul
)
) else (
call :print_message YELLOW "实例 %port% 未运行"
)
goto :eof
REM 重启单个实例
:restart_instance
set port=%1
call :print_message YELLOW "重启实例 %port%..."
call :stop_instance %port%
timeout /t 2 /nobreak >nul
if "%port%"=="9900" call :start_instance %port% prod-9900
if "%port%"=="9901" call :start_instance %port% prod-9901
if "%port%"=="9902" call :start_instance %port% prod-9902
if "%port%"=="9903" call :start_instance %port% prod-9903
goto :eof
REM 查看实例状态
:status_instance
set port=%1
set pid_file=logs\ruoyi-admin-%port%.pid
if exist "%pid_file%" (
for /f "tokens=*" %%i in (%pid_file%) do set pid=%%i
tasklist /FI "PID eq !pid!" 2>nul | find /I "!pid!" >nul
if !errorlevel! equ 0 (
call :print_message GREEN "实例 %port%: 运行中 (PID: !pid!)"
) else (
call :print_message RED "实例 %port%: 异常 (PID文件存在但进程不存在)"
del "%pid_file%" 2>nul
)
) else (
call :print_message YELLOW "实例 %port%: 未运行"
)
goto :eof
REM 启动所有实例
:start_all
call :print_message GREEN "启动所有实例..."
call :start_instance 9900 prod-9900
timeout /t 2 /nobreak >nul
call :start_instance 9901 prod-9901
timeout /t 2 /nobreak >nul
call :start_instance 9902 prod-9902
timeout /t 2 /nobreak >nul
call :start_instance 9903 prod-9903
goto :eof
REM 停止所有实例
:stop_all
call :print_message YELLOW "停止所有实例..."
call :stop_instance 9900
call :stop_instance 9901
call :stop_instance 9902
call :stop_instance 9903
goto :eof
REM 重启所有实例
:restart_all
call :print_message YELLOW "重启所有实例..."
call :stop_all
timeout /t 3 /nobreak >nul
call :start_all
goto :eof
REM 查看所有实例状态
:status_all
call :print_message GREEN "所有实例状态:"
call :status_instance 9900
call :status_instance 9901
call :status_instance 9902
call :status_instance 9903
goto :eof
REM 显示帮助信息
:show_help
echo 多实例启动脚本使用方法:
echo %0 [命令] [实例名称]
echo.
echo 命令:
echo start 启动实例
echo stop 停止实例
echo restart 重启实例
echo status 查看实例状态
echo.
echo 实例名称:
echo 9900 启动9900端口实例
echo 9901 启动9901端口实例
echo 9902 启动9902端口实例
echo 9903 启动9903端口实例
echo all 操作所有实例
echo.
echo 示例:
echo %0 start 9900 # 启动9900端口实例
echo %0 start all # 启动所有实例
echo %0 stop 9900 # 停止9900端口实例
echo %0 status all # 查看所有实例状态
echo %0 restart all # 重启所有实例
goto :eof
REM 主函数
:main
set action=%1
set instance=%2
REM 检查参数
if "%action%"=="" (
call :show_help
pause
exit /b 1
)
REM 检查JAR文件
call :check_jar
if !errorlevel! neq 0 goto :eof
if "%action%"=="start" (
if "%instance%"=="all" (
call :start_all
) else if "%instance%"=="9900" (
call :start_instance 9900 prod-9900
) else if "%instance%"=="9901" (
call :start_instance 9901 prod-9901
) else if "%instance%"=="9902" (
call :start_instance 9902 prod-9902
) else if "%instance%"=="9903" (
call :start_instance 9903 prod-9903
) else (
call :print_message RED "无效的实例名称: %instance%"
call :show_help
pause
exit /b 1
)
) else if "%action%"=="stop" (
if "%instance%"=="all" (
call :stop_all
) else if "%instance%"=="9900" (
call :stop_instance 9900
) else if "%instance%"=="9901" (
call :stop_instance 9901
) else if "%instance%"=="9902" (
call :stop_instance 9902
) else if "%instance%"=="9903" (
call :stop_instance 9903
) else (
call :print_message RED "无效的实例名称: %instance%"
call :show_help
pause
exit /b 1
)
) else if "%action%"=="restart" (
if "%instance%"=="all" (
call :restart_all
) else if "%instance%"=="9900" (
call :restart_instance 9900
) else if "%instance%"=="9901" (
call :restart_instance 9901
) else if "%instance%"=="9902" (
call :restart_instance 9902
) else if "%instance%"=="9903" (
call :restart_instance 9903
) else (
call :print_message RED "无效的实例名称: %instance%"
call :show_help
pause
exit /b 1
)
) else if "%action%"=="status" (
if "%instance%"=="all" (
call :status_all
) else if "%instance%"=="9900" (
call :status_instance 9900
) else if "%instance%"=="9901" (
call :status_instance 9901
) else if "%instance%"=="9902" (
call :status_instance 9902
) else if "%instance%"=="9903" (
call :status_instance 9903
) else (
call :print_message RED "无效的实例名称: %instance%"
call :show_help
pause
exit /b 1
)
) else (
call :print_message RED "无效的命令: %action%"
call :show_help
pause
exit /b 1
)
pause
goto :eof