From c8924c625c1c0e5a3d0aeffbe4fba732d248ce6a Mon Sep 17 00:00:00 2001 From: panda <1415243231@qq.com> Date: Sat, 23 May 2026 09:25:45 +0800 Subject: [PATCH] fix: rewrite startup scripts with reliable helpers, stderr logging, visible windows - Replace /MIN (hidden window) with normal windows so errors are visible - Redirect stderr to logs/*.log for post-mortem - Extract killport/wait_health/wait_port into callable helpers - Use !N! (delayed expansion) for retry counters - stop.bat now shows which PIDs it kills with port labels - Remove nested-quote issue by cd'ing before npm start --- start.bat | 40 ++++++++++------- start_all.bat | 122 +++++++++++++++++++++++++------------------------- stop.bat | 27 +++++++++-- 3 files changed, 107 insertions(+), 82 deletions(-) diff --git a/start.bat b/start.bat index bdc90a2..f2f91b5 100644 --- a/start.bat +++ b/start.bat @@ -6,47 +6,46 @@ echo agent_jrxml 启动 (API + 验证) echo ================================================ cd /d "%~dp0" -:: 环境检查 +:: ── 环境检查 ── if not exist "%~dp0.venv\Scripts\python.exe" ( echo [错误] 未找到 .venv,请先创建虚拟环境 pause exit /b 1 ) -:: 清理残留进程 +echo. + +:: ── 清理残留进程 ── echo [清理] 检查残留进程... for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8000.*LISTENING"') do ( - taskkill /F /PID %%a >nul 2>&1 && echo 已清理 PID %%a + taskkill /F /PID %%a >nul 2>&1 && echo 已清理端口 8000 (PID %%a) ) for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8001.*LISTENING"') do ( - taskkill /F /PID %%a >nul 2>&1 && echo 已清理 PID %%a + taskkill /F /PID %%a >nul 2>&1 && echo 已清理端口 8001 (PID %%a) ) echo. -:: 启动验证服务 (后台最小化) +:: ── 1. 验证服务 ── echo [启动] 验证服务 :8001 -start "jrxml-validator" /MIN .venv\Scripts\python.exe -c "import uvicorn; uvicorn.run('validation_service.main:app',host='0.0.0.0',port=8001,reload=False)" +start "jrxml-validator" .venv\Scripts\python.exe -c "import uvicorn; uvicorn.run('validation_service.main:app',host='0.0.0.0',port=8001,reload=False)" 2> "%~dp0logs\validator-stderr.log" -:: 等待验证服务就绪 (用 PowerShell 检测) echo [等待] 验证服务就绪... -set /a RETRY=0 +set /a N=0 :wait_val ping -n 2 127.0.0.1 >nul powershell -Command "try{$r=Invoke-WebRequest -Uri http://localhost:8001/health -TimeoutSec 2 -UseBasicParsing;exit 0}catch{exit 1}" >nul 2>&1 if not errorlevel 1 goto val_ok -set /a RETRY+=1 -if %RETRY% GEQ 30 ( - echo [失败] 验证服务启动超时,请检查端口 8001 是否被占用 - taskkill /F /FI "WINDOWTITLE eq jrxml-validator*" >nul 2>&1 - for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8001.*LISTENING"') do taskkill /F /PID %%a >nul 2>&1 - pause - exit /b 1 +set /a N+=1 +if !N! GEQ 30 ( + echo [失败] 验证服务启动超时 (30次重试) + echo 请检查: logs\validator-stderr.log + goto cleanup ) goto wait_val :val_ok echo :8001 就绪 -:: 启动 API 服务 (前台,Ctrl+C 退出) +:: ── 2. API 服务 (前台运行) ── echo [启动] API 服务 :8000 echo ================================================ echo 服务已就绪: @@ -57,10 +56,17 @@ echo 关闭窗口后会自动清理验证服务 echo ================================================ .venv\Scripts\python.exe -c "import uvicorn; uvicorn.run('api_server:app',host='0.0.0.0',port=8000,reload=False)" -:: API 进程退出后自动清理 +:: ── API 退出后清理 ── echo. echo [清理] 停止验证服务... taskkill /F /FI "WINDOWTITLE eq jrxml-validator*" >nul 2>&1 for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8001.*LISTENING"') do taskkill /F /PID %%a >nul 2>&1 echo 已停止所有服务 pause +exit /b 0 + +:cleanup +taskkill /F /FI "WINDOWTITLE eq jrxml-validator*" >nul 2>&1 +for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8001.*LISTENING"') do taskkill /F /PID %%a >nul 2>&1 +pause +exit /b 1 diff --git a/start_all.bat b/start_all.bat index 45f43dd..3afbe46 100644 --- a/start_all.bat +++ b/start_all.bat @@ -6,77 +6,45 @@ echo agent_jrxml 启动 (全栈) echo ================================================ cd /d "%~dp0" -:: 环境检查 +:: ── 环境检查 ── if not exist "%~dp0.venv\Scripts\python.exe" ( echo [错误] 未找到 .venv,请先创建虚拟环境 pause exit /b 1 ) - -:: 清理残留进程 -echo [清理] 检查残留进程... -for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8000.*LISTENING"') do taskkill /F /PID %%a >nul 2>&1 -for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8001.*LISTENING"') do taskkill /F /PID %%a >nul 2>&1 -for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":5173.*LISTENING"') do taskkill /F /PID %%a >nul 2>&1 -echo. - -:: 1. 验证服务 -echo [1/3] 验证服务 :8001 -start "jrxml-validator" /MIN .venv\Scripts\python.exe -c "import uvicorn; uvicorn.run('validation_service.main:app',host='0.0.0.0',port=8001,reload=False)" -set /a RETRY=0 -:wait_val -ping -n 2 127.0.0.1 >nul -powershell -Command "try{$r=Invoke-WebRequest -Uri http://localhost:8001/health -TimeoutSec 2 -UseBasicParsing;exit 0}catch{exit 1}" >nul 2>&1 -if not errorlevel 1 goto val_ok -set /a RETRY+=1 -if %RETRY% GEQ 30 ( - echo [失败] 验证服务启动超时,请检查端口 8001 是否被占用 - goto cleanup -) -goto wait_val -:val_ok -echo :8001 就绪 - -:: 2. API 服务 -echo [2/3] API 服务 :8000 -start "jrxml-api" /MIN .venv\Scripts\python.exe -c "import uvicorn; uvicorn.run('api_server:app',host='0.0.0.0',port=8000,reload=False)" -set /a RETRY=0 -:wait_api -ping -n 2 127.0.0.1 >nul -powershell -Command "try{$r=Invoke-WebRequest -Uri http://localhost:8000/api/health -TimeoutSec 2 -UseBasicParsing;exit 0}catch{exit 1}" >nul 2>&1 -if not errorlevel 1 goto api_ok -set /a RETRY+=1 -if %RETRY% GEQ 30 ( - echo [失败] API 服务启动超时,请检查端口 8000 是否被占用 - goto cleanup -) -goto wait_api -:api_ok -echo :8000 就绪 - -:: 3. 前端 -echo [3/3] 前端 :5173 if not exist "%~dp0frontend\node_modules" ( - echo [安装] node_modules 不存在,正在 npm install... + echo [安装] node_modules 不存在,正在 npm install... cd /d "%~dp0frontend" call npm install cd /d "%~dp0" ) + +echo. + +:: ── 清理残留进程 ── +call :killport 8000 +call :killport 8001 +call :killport 5173 +echo. + +:: ── 1. 验证服务 ── +echo [1/3] 启动验证服务 :8001 ... +start "jrxml-validator" .venv\Scripts\python.exe -c "import uvicorn; uvicorn.run('validation_service.main:app',host='0.0.0.0',port=8001,reload=False)" 2> "%~dp0logs\validator-stderr.log" +call :wait_health "8001" "验证服务" || goto cleanup +echo :8001 就绪 + +:: ── 2. API 服务 ── +echo [2/3] 启动 API 服务 :8000 ... +start "jrxml-api" .venv\Scripts\python.exe -c "import uvicorn; uvicorn.run('api_server:app',host='0.0.0.0',port=8000,reload=False)" 2> "%~dp0logs\api-stderr.log" +call :wait_health "8000/api" "API 服务" || goto cleanup +echo :8000 就绪 + +:: ── 3. 前端 ── +echo [3/3] 启动前端 :5173 ... cd /d "%~dp0frontend" -start "jrxml-frontend" /MIN cmd /c "npm run dev" +start "jrxml-frontend" cmd /c "npm run dev" 2> "%~dp0logs\frontend-stderr.log" cd /d "%~dp0" -set /a RETRY=0 -:wait_fe -ping -n 3 127.0.0.1 >nul -powershell -Command "try{$r=Invoke-WebRequest -Uri http://localhost:5173 -TimeoutSec 3 -UseBasicParsing;exit 0}catch{exit 1}" >nul 2>&1 -if not errorlevel 1 goto fe_ok -set /a RETRY+=1 -if %RETRY% GEQ 30 ( - echo [失败] 前端启动超时,请检查端口 5173 是否被占用 - goto cleanup -) -goto wait_fe -:fe_ok +call :wait_port "5173" "前端" || goto cleanup echo :5173 就绪 echo. @@ -90,13 +58,45 @@ echo ================================================ pause exit /b 0 +:: ── Cleanup ── :cleanup echo [清理] 停止已启动的服务... taskkill /F /FI "WINDOWTITLE eq jrxml-validator*" >nul 2>&1 taskkill /F /FI "WINDOWTITLE eq jrxml-api*" >nul 2>&1 taskkill /F /FI "WINDOWTITLE eq jrxml-frontend*" >nul 2>&1 -for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8001.*LISTENING"') do taskkill /F /PID %%a >nul 2>&1 -for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8000.*LISTENING"') do taskkill /F /PID %%a >nul 2>&1 +call :killport 8001 +call :killport 8000 +call :killport 5173 echo 已清理,请重试 pause exit /b 1 + +:: ── Helper: kill process on port ── +:killport +for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":%1.*LISTENING"') do ( + echo 清理端口 %1 (PID %%a) + taskkill /F /PID %%a >nul 2>&1 +) +exit /b 0 + +:: ── Helper: wait for HTTP health check ── +:wait_health +set /a N=0 +:wait_health_loop +ping -n 2 127.0.0.1 >nul +powershell -Command "try{$r=Invoke-WebRequest -Uri http://localhost:%1/health -TimeoutSec 2 -UseBasicParsing;exit 0}catch{exit 1}" >nul 2>&1 +if not errorlevel 1 exit /b 0 +set /a N+=1 +if !N! GEQ 30 exit /b 1 +goto wait_health_loop + +:: ── Helper: wait for TCP port ── +:wait_port +set /a N=0 +:wait_port_loop +ping -n 3 127.0.0.1 >nul +netstat -ano | findstr ":%1.*LISTENING" >nul 2>&1 +if not errorlevel 1 exit /b 0 +set /a N+=1 +if !N! GEQ 30 exit /b 1 +goto wait_port_loop diff --git a/stop.bat b/stop.bat index 5d3e9ba..3d61537 100644 --- a/stop.bat +++ b/stop.bat @@ -1,8 +1,27 @@ @echo off chcp 65001 >nul -echo [清理] 停止所有 agent_jrxml 服务... -for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8000.*LISTENING"') do taskkill /F /PID %%a 2>nul -for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8001.*LISTENING"') do taskkill /F /PID %%a 2>nul -for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":5173.*LISTENING"') do taskkill /F /PID %%a 2>nul +echo ================================================ +echo 停止所有 agent_jrxml 服务 +echo ================================================ + +echo [停止] 按窗口标题清理... +taskkill /F /FI "WINDOWTITLE eq jrxml-validator*" 2>nul +taskkill /F /FI "WINDOWTITLE eq jrxml-api*" 2>nul +taskkill /F /FI "WINDOWTITLE eq jrxml-frontend*" 2>nul + +echo [停止] 按端口清理... +for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8000.*LISTENING"') do ( + echo 端口 8000 - PID %%a + taskkill /F /PID %%a >nul 2>&1 +) +for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8001.*LISTENING"') do ( + echo 端口 8001 - PID %%a + taskkill /F /PID %%a >nul 2>&1 +) +for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":5173.*LISTENING"') do ( + echo 端口 5173 - PID %%a + taskkill /F /PID %%a >nul 2>&1 +) + echo 已停止 pause