最直接有效的应对windows服务意外停止的方式是建立轻量、可靠、可落地的监控与自动重启机制,核心思路为定期探测服务状态→判定是否已停止→若停止则立即启动→持续循环执行。
windows 服务一旦意外停止,可能直接影响业务连续性。最直接有效的应对方式不是依赖人工巡检,而是建立轻量、可靠、可落地的监控与自动重启机制。核心思路是:定期探测服务状态 → 判定是否已停止 → 若停止则立即启动 → 持续循环执行。
用批处理脚本实现基础服务监控
这是门槛最低、无需额外安装的方案,适合对单个关键服务(如 wuauserv、Spooler 或自定义服务)做简单守护。
- 新建一个文本文件,重命名为 MonitorService.bat
- 粘贴以下内容,并将 "YourServiceName" 替换为实际服务名(可用
sc query或服务管理器确认显示名称或服务名):
@echo off
set secs=60
set srvname="YourServiceName"
:chkit
sc query %srvname% | findstr /i "RUNNING" >nul
if errorlevel 1 (
echo [%time%] %srvname% 未运行,正在尝试启动...
net start %srvname% >nul 2>&1
if errorlevel 1 echo 启动失败,请检查服务依赖或权限
else echo [%time%] 启动成功
) else (
echo [%time%] %srvname% 正常运行中
)
ping -n %secs% 127.0.0.1 >nul
goto chkit
- 双击运行该脚本即可开始监控;如需后台静默运行,可另建一个启动脚本调用
start /min cmd /c MonitorService.bat - 注意:
sc query比net start更准确,能区分“已停止”和“启动失败”状态
用 Python 脚本实现精准进程级监控
当需要监控的是 Python 应用本身(而非 Windows 服务),或需区分多个同名 python.exe 进程时,Python 方案更灵活可靠。
- 确保已安装 psutil:
pip install psutil - 以下代码会精确识别命令行中含指定脚本路径的 Python 进程:
import psutil
import subprocess
import time
SCRIPT_PATH = r"C:\myapp\main.py" # 替换为你的绝对路径
def is_running():
for p in psutil.process_iter(['pid', 'name', 'cmdline']):
try:
if p.info['name'] == 'python.exe' and len(p.info['cmdline']) > 1:
if SCRIPT_PATH in p.info['cmdline'][1]:
return True
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
return False
def start_app():
subprocess.Popen(['python', SCRIPT_PATH], creationflags=subprocess.CREATE_NO_WINDOW)
while True:
if not is_running():
print(f"[{time.strftime('%H:%M:%S')}] 进程未运行,启动 {SCRIPT_PATH}")
start_app()
time.sleep(30)
- 保存为 watchdog.py,用
python watchdog.py启动;建议配合任务计划程序设为开机启动 - 使用
CREATE_NO_WINDOW可避免弹出黑窗口,适合无界面环境
集成到系统级服务或计划任务
让监控脚本真正“扎根”系统,做到开机即启、无人值守。
- 通过任务计划程序设置开机启动:打开“任务计划程序”,创建基本任务 → 触发器选“登录时”或“启动时” → 操作选“启动程序”,指向你的 .bat 或 .py 文件
-
注册为 Windows 服务(进阶):用
pywin32的win32serviceutil.InstallService将 Python 监控脚本封装为系统服务,获得服务管理、自动恢复、日志记录等能力 -
避免命名冲突:若监控多个 Python 应用,建议为每个应用单独复制一份 python.exe 并重命名(如
app1.exe),再用psutil按进程名匹配,比解析命令行更稳定
关键注意事项
机制有效与否,往往取决于细节处理。
- 权限问题:监控系统服务(如 WMI、Event Log)或启动服务通常需管理员权限,脚本应以管理员身份运行
- 启动依赖:某些服务启动前需其他服务就绪(如网络、数据库),可在脚本中加入等待逻辑或依赖检查
- 防重复启动:加锁文件或进程互斥机制,避免因检测延迟导致同一服务被多次启动
- 日志记录:在脚本中添加
print(... >> open('monitor.log', 'a')),便于事后排查异常










