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:
@@ -6,47 +6,46 @@ echo agent_jrxml 启动 (API + 验证)
|
|||||||
echo ================================================
|
echo ================================================
|
||||||
cd /d "%~dp0"
|
cd /d "%~dp0"
|
||||||
|
|
||||||
:: 环境检查
|
:: ── 环境检查 ──
|
||||||
if not exist "%~dp0.venv\Scripts\python.exe" (
|
if not exist "%~dp0.venv\Scripts\python.exe" (
|
||||||
echo [错误] 未找到 .venv,请先创建虚拟环境
|
echo [错误] 未找到 .venv,请先创建虚拟环境
|
||||||
pause
|
pause
|
||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
|
|
||||||
:: 清理残留进程
|
echo.
|
||||||
|
|
||||||
|
:: ── 清理残留进程 ──
|
||||||
echo [清理] 检查残留进程...
|
echo [清理] 检查残留进程...
|
||||||
for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8000.*LISTENING"') do (
|
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 (
|
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.
|
echo.
|
||||||
|
|
||||||
:: 启动验证服务 (后台最小化)
|
:: ── 1. 验证服务 ──
|
||||||
echo [启动] 验证服务 :8001
|
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 [等待] 验证服务就绪...
|
echo [等待] 验证服务就绪...
|
||||||
set /a RETRY=0
|
set /a N=0
|
||||||
:wait_val
|
:wait_val
|
||||||
ping -n 2 127.0.0.1 >nul
|
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
|
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
|
if not errorlevel 1 goto val_ok
|
||||||
set /a RETRY+=1
|
set /a N+=1
|
||||||
if %RETRY% GEQ 30 (
|
if !N! GEQ 30 (
|
||||||
echo [失败] 验证服务启动超时,请检查端口 8001 是否被占用
|
echo [失败] 验证服务启动超时 (30次重试)
|
||||||
taskkill /F /FI "WINDOWTITLE eq jrxml-validator*" >nul 2>&1
|
echo 请检查: logs\validator-stderr.log
|
||||||
for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8001.*LISTENING"') do taskkill /F /PID %%a >nul 2>&1
|
goto cleanup
|
||||||
pause
|
|
||||||
exit /b 1
|
|
||||||
)
|
)
|
||||||
goto wait_val
|
goto wait_val
|
||||||
:val_ok
|
:val_ok
|
||||||
echo :8001 就绪
|
echo :8001 就绪
|
||||||
|
|
||||||
:: 启动 API 服务 (前台,Ctrl+C 退出)
|
:: ── 2. API 服务 (前台运行) ──
|
||||||
echo [启动] API 服务 :8000
|
echo [启动] API 服务 :8000
|
||||||
echo ================================================
|
echo ================================================
|
||||||
echo 服务已就绪:
|
echo 服务已就绪:
|
||||||
@@ -57,10 +56,17 @@ echo 关闭窗口后会自动清理验证服务
|
|||||||
echo ================================================
|
echo ================================================
|
||||||
.venv\Scripts\python.exe -c "import uvicorn; uvicorn.run('api_server:app',host='0.0.0.0',port=8000,reload=False)"
|
.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.
|
||||||
echo [清理] 停止验证服务...
|
echo [清理] 停止验证服务...
|
||||||
taskkill /F /FI "WINDOWTITLE eq jrxml-validator*" >nul 2>&1
|
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
|
for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8001.*LISTENING"') do taskkill /F /PID %%a >nul 2>&1
|
||||||
echo 已停止所有服务
|
echo 已停止所有服务
|
||||||
pause
|
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
|
||||||
|
|||||||
+60
-60
@@ -6,77 +6,45 @@ echo agent_jrxml 启动 (全栈)
|
|||||||
echo ================================================
|
echo ================================================
|
||||||
cd /d "%~dp0"
|
cd /d "%~dp0"
|
||||||
|
|
||||||
:: 环境检查
|
:: ── 环境检查 ──
|
||||||
if not exist "%~dp0.venv\Scripts\python.exe" (
|
if not exist "%~dp0.venv\Scripts\python.exe" (
|
||||||
echo [错误] 未找到 .venv,请先创建虚拟环境
|
echo [错误] 未找到 .venv,请先创建虚拟环境
|
||||||
pause
|
pause
|
||||||
exit /b 1
|
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" (
|
if not exist "%~dp0frontend\node_modules" (
|
||||||
echo [安装] node_modules 不存在,正在 npm install...
|
echo [安装] node_modules 不存在,正在 npm install...
|
||||||
cd /d "%~dp0frontend"
|
cd /d "%~dp0frontend"
|
||||||
call npm install
|
call npm install
|
||||||
cd /d "%~dp0"
|
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"
|
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"
|
cd /d "%~dp0"
|
||||||
set /a RETRY=0
|
call :wait_port "5173" "前端" || goto cleanup
|
||||||
: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
|
|
||||||
echo :5173 就绪
|
echo :5173 就绪
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
@@ -90,13 +58,45 @@ echo ================================================
|
|||||||
pause
|
pause
|
||||||
exit /b 0
|
exit /b 0
|
||||||
|
|
||||||
|
:: ── Cleanup ──
|
||||||
:cleanup
|
:cleanup
|
||||||
echo [清理] 停止已启动的服务...
|
echo [清理] 停止已启动的服务...
|
||||||
taskkill /F /FI "WINDOWTITLE eq jrxml-validator*" >nul 2>&1
|
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-api*" >nul 2>&1
|
||||||
taskkill /F /FI "WINDOWTITLE eq jrxml-frontend*" >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
|
call :killport 8001
|
||||||
for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8000.*LISTENING"') do taskkill /F /PID %%a >nul 2>&1
|
call :killport 8000
|
||||||
|
call :killport 5173
|
||||||
echo 已清理,请重试
|
echo 已清理,请重试
|
||||||
pause
|
pause
|
||||||
exit /b 1
|
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
|
||||||
|
|||||||
@@ -1,8 +1,27 @@
|
|||||||
@echo off
|
@echo off
|
||||||
chcp 65001 >nul
|
chcp 65001 >nul
|
||||||
echo [清理] 停止所有 agent_jrxml 服务...
|
echo ================================================
|
||||||
for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8000.*LISTENING"') do taskkill /F /PID %%a 2>nul
|
echo 停止所有 agent_jrxml 服务
|
||||||
for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":8001.*LISTENING"') do taskkill /F /PID %%a 2>nul
|
echo ================================================
|
||||||
for /f "tokens=5" %%a in ('netstat -ano ^| findstr ":5173.*LISTENING"') do taskkill /F /PID %%a 2>nul
|
|
||||||
|
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 已停止
|
echo 已停止
|
||||||
pause
|
pause
|
||||||
|
|||||||
Reference in New Issue
Block a user