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
This commit is contained in:
2026-05-23 09:25:45 +08:00
parent 9a4f51d378
commit c8924c625c
3 changed files with 107 additions and 82 deletions
+23 -17
View File
@@ -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