@echo off chcp 65001 >nul 2>&1 title "Nginx 快速管理助手" setlocal enabledelayedexpansion set "NGINX_DIR=%~dp0" set "NGINX_DIR=%NGINX_DIR:~0,-1%" :MENU cls echo "==========================================" echo " Nginx 快速管理助手" echo "==========================================" echo "当前工作目录: %NGINX_DIR%" echo "------------------------------------------" echo '[1] 启动 Nginx' echo '[2] 停止 Nginx (优雅退出)' echo '[3] 强制停止 Nginx' echo '[4] 重启 Nginx (平滑重载配置)' echo '[5] 彻底重启 (强制停止后重新启动)' echo '[6] 查看运行状态' echo '[7] 测试配置文件语法' echo '[0] 退出' echo '==========================================' set /p "choice=请输入选项并按回车: " if "%choice%"=="1" goto START if "%choice%"=="2" goto STOP if "%choice%"=="3" goto FORCE_STOP if "%choice%"=="4" goto RELOAD if "%choice%"=="5" goto RESTART if "%choice%"=="6" goto STATUS if "%choice%"=="7" goto TEST_CONF if "%choice%"=="0" exit /b echo "输入无效,请按任意键重试..." pause >nul goto MENU :START echo. echo "[正在检查状态...]" :: 使用 findstr /C 精确匹配进程名,防止匹配到其他包含 nginx 字符的进程 tasklist /NH /FI "IMAGENAME eq nginx.exe" | findstr /i /C:"nginx.exe" >nul 2>&1 if %errorlevel% equ 0 ( echo "[提示] Nginx 已经在运行中,无需重复启动。" ) else ( echo "[正在启动 Nginx...]" cd /d "%NGINX_DIR%" :: 直接使用 nginx.exe 启动,它会自行转入后台运行,不会产生额外弹窗 start "" /B nginx.exe :: 增加循环检测,最多尝试5次,每次间隔1秒,解决进程启动延迟问题 set "retry_count=0" :CHECK_LOOP timeout /t 1 /nobreak >nul tasklist /NH /FI "IMAGENAME eq nginx.exe" | findstr /i /C:"nginx.exe" >nul 2>&1 if %errorlevel% equ 0 ( echo "[成功] Nginx 已在后台启动。" goto START_SUCCESS ) set /a retry_count+=1 if !retry_count! LSS 5 goto CHECK_LOOP :: 如果循环结束仍未检测到进程,判定为启动失败,并自动打印错误日志 echo "[失败] 启动超时,Nginx 进程未正常驻留。" echo "------------------------------------------" echo "最新错误日志摘要 (logs/error.log):" if exist "logs\error.log" ( powershell -Command "Get-Content 'logs\error.log' -Tail 10 -Encoding UTF8" ) else ( echo "未找到 logs\error.log 文件。" ) echo "------------------------------------------" echo "常见原因: 80/443端口被占用(IIS/Skype/其他Web服务)或配置文件语法错误。" ) :START_SUCCESS pause >nul goto MENU :: "2号 优雅停止 优化方案:增加循环检测与最终状态裁决" :STOP echo. echo "[正在执行优雅停止...]" tasklist /NH /FI "IMAGENAME eq nginx.exe" | findstr /i /C:"nginx.exe" >nul 2>&1 if %errorlevel% neq 0 ( echo "[提示] Nginx 当前未运行,无需停止。" ) else ( cd /d "%NGINX_DIR%" :: 发送优雅退出信号,Nginx 主进程会等待 worker 处理完请求再退出 nginx.exe -s quit >nul 2>&1 echo "[等待进程退出...]" set "wait_count=0" :STOP_LOOP timeout /t 1 /nobreak >nul :: 再次检查进程是否存在 tasklist /NH /FI "IMAGENAME eq nginx.exe" | findstr /i /C:"nginx.exe" >nul 2>&1 if %errorlevel% neq 0 ( echo "[成功] Nginx 已优雅停止,所有进程已清理。" goto STOP_END ) set /a wait_count+=1 :: 最多等待 10 秒,防止无限循环 if !wait_count! LSS 10 goto STOP_LOOP :: 循环结束仍未退出,进行最终状态裁决 echo "------------------------------------------" echo "[注意] 优雅停止等待超时 (10秒)。" tasklist /FI "IMAGENAME eq nginx.exe" echo "------------------------------------------" echo "当前 Nginx 仍在运行,通常有以下两种情况:" echo "1. 仍有未处理完的请求(如长连接、大文件传输),Nginx 正在安全收尾。" echo "2. 进程发生死锁或卡死,无法正常响应退出信号。" echo "建议:若无重要业务运行,请输入 [3] 强制停止以清理残留进程。" ) :STOP_END pause >nul goto MENU :FORCE_STOP echo. echo "[正在强制终止进程...]" tasklist /NH /FI "IMAGENAME eq nginx.exe" | findstr /i "nginx.exe" >nul 2>&1 if %errorlevel% neq 0 ( echo "[提示] Nginx 当前未运行。" ) else ( taskkill /F /T /IM nginx.exe >nul 2>&1 echo "[成功] 所有 Nginx 进程已强制终止。" ) pause >nul goto MENU :RELOAD echo. echo "[正在平滑重载配置...]" tasklist /NH /FI "IMAGENAME eq nginx.exe" | findstr /i "nginx.exe" >nul 2>&1 if %errorlevel% neq 0 ( echo "[警告] Nginx 未运行,无法重载配置。是否现在启动?(Y/N)" set /p "confirm=" if /i "!confirm!"=="Y" goto START goto MENU ) else ( cd /d "%NGINX_DIR%" nginx.exe -s reload >nul 2>&1 echo "[成功] 配置重载指令已发送。" ) pause >nul goto MENU :RESTART echo. echo "[正在执行彻底重启...]" call :FORCE_STOP timeout /t 1 /nobreak >nul call :START goto MENU :STATUS echo. echo "[当前 Nginx 进程状态:]" echo "------------------------------------------" tasklist /FI "IMAGENAME eq nginx.exe" echo "------------------------------------------" tasklist /NH /FI "IMAGENAME eq nginx.exe" | findstr /i "nginx.exe" >nul 2>&1 if %errorlevel% neq 0 ( echo "[提示] 未找到运行中的 Nginx 进程。" ) else ( echo "[提示] 正常运行存在主进程+工作进程。" ) pause >nul goto MENU :TEST_CONF echo. echo "[正在测试配置文件语法...]" cd /d "%NGINX_DIR%" nginx.exe -t if %errorlevel% equ 0 ( echo "[成功] 配置文件语法正确。" ) else ( echo "[错误] 配置文件存在语法错误,请修改后重试。" ) pause >nul goto MENU