如何使用Python检测Windows系统中程序是否停止运行
问题核心原因
你现有代码无法检测到目标异常的原因非常明确:你遇到的程序停止属于进程直接闪退、崩溃退出的场景——此时程序进程已经从系统进程列表中被清除,根本不会携带「未响应」的状态标记。你原逻辑筛选STATUS eq not responding仅能匹配进程仍在运行、但窗口消息循环卡住的假死场景,自然无法覆盖进程直接消失的崩溃情况。
这类检测完全可以通过Python实现,不需要借助额外工具。
可选实现方案
方案1:纯标准库实现,适配原有tasklist逻辑
不需要生成临时文件,直接判断目标进程是否存在于进程列表即可,注意规避不同语言系统下tasklist输出格式差异导致的解析报错:
import os import time def is_process_running(process_name): # 仅筛选进程名,不限制状态 task_output = os.popen(f'tasklist /FI "IMAGENAME eq {process_name}"').read() # 系统返回无匹配进程时,结果中不会出现目标进程名,直接判断即可 return process_name.lower() in task_output.lower() if __name__ == "__main__": target_exe = "your_program.exe" # 替换为要检测的程序名,例如notepad.exe check_gap = 5 # 检测间隔,单位秒 while True: if not is_process_running(target_exe): # 替换为你需要的提醒逻辑 print(f"警告:{target_exe} 已停止运行") # Windows系统自带弹框提醒示例 os.system('msg * "目标程序已异常停止,请及时检查"') break time.sleep(check_gap)
该方案无额外依赖,但因为依赖命令行文本解析,在多语言系统环境下可能需要微调判断规则。
方案2:psutil库实现(稳定性更高,推荐)
使用第三方进程管理库psutil可以直接读取系统进程列表,不需要解析命令行输出,跨版本、跨语言系统兼容性更好,也支持拓展更多检测规则:
- 先安装依赖:
pip install psutil
- 检测代码示例:
import psutil import time import os def is_process_running(process_name): for proc in psutil.process_iter(['name']): try: if proc.info['name'].lower() == process_name.lower(): return True except (psutil.NoSuchProcess, psutil.AccessDenied): # 跳过遍历过程中刚好退出、或无权限访问的进程 continue return False if __name__ == "__main__": target_exe = "your_program.exe" check_gap = 5 while True: if not is_process_running(target_exe): print(f"警告:{target_exe} 已停止运行") os.system('msg * "目标程序已异常停止,请及时检查"') break time.sleep(check_gap)
拓展提示
- 如果需要同时覆盖程序假死(未响应)场景,可以在判定进程存在的基础上,补充你原来写的未响应检测逻辑,两类异常就都能捕获。
- 检测间隔不建议设置过短,1-10秒区间即可,不会占用额外系统资源。
- 提醒逻辑可以按需替换,比如对接邮件、消息推送机器人、声音警报等。
内容的提问来源于stack exchange,提问作者TheAmazingHAzza
相关产品推荐
相关产品推荐

