Python实现Windows下无响应进程自动检测与重启
本文介绍使用Python脚本在Windows平台上自动检测无响应进程并重启的方法。通过schedule库实现定时调度,利用os.popen执行tasklist命令筛选状态为“无响应”的进程,获取PID后强制结束并重新启动程序。适用于需要保持长期运行但偶尔卡死的Windows应用程序场景。
Windows无响应进程自动重启方案
在Windows平台运行某些程序时,常出现因资源占用或逻辑缺陷导致的无响应问题。虽然这些程序不可或缺,但每次发现卡死都需手动重启,效率低下。为此,编写一个自动化脚本,定期检测进程状态并在无响应时自动重启,成为提升稳定性的有效手段。
核心技术点
实现该功能主要涉及以下核心技术点:
- 使用schedule库进行定时任务调度,设定检查周期。
- 利用os.popen调用系统命令,获取进程列表并解析输出结果。
脚本逻辑分解
接下来对脚本逻辑进行分解说明。
主入口与调度机制
脚本的主入口负责初始化调度器。核心逻辑是设定一个固定间隔(如每5秒)执行检查任务,并通过无限循环调用schedule.run_pending()来触发待处理任务,每次检查后短暂休眠1秒以节省CPU资源。
if __name__ == '__main__':
#每5秒执行检查任务
schedule.every(5).seconds.do(check_job)
#此处固定写法,意思是每秒钟schedule看下是否有pending的任务,有就执行
while True:
schedule.run_pending()
time.sleep(1)
schedule调度示例
schedule库支持多种时间调度方式,例如每10分钟执行一次、每小时执行一次,或指定具体时间点(如每天10:30)执行。其核心机制是轮询pending任务并立即执行,配合time.sleep()控制轮询频率。
import schedule
import time
def job(message='stuff'):
print("I'm working on:", message)
#每10分钟
schedule.every(10).minutes.do(job)
#每小时
schedule.every().hour.do(job, message='things')
#每天10点30分
schedule.every().day.at("10:30").do(job)
while True:
schedule.run_pending()
time.sleep(1)
进程检查与重启逻辑
核心检查函数check_job定义了目标进程名,调用list_not_response获取无响应进程列表。若列表为空则直接返回;否则拼接PID参数,使用taskkill命令强制终止这些进程。随后再次检查进程是否存在,若已消失则启动指定路径的程序。
def check_job():
process_name = "xx.exe"
not_respond_list = list_not_response(process_name)
if len(not_respond_list) <= 0:
return
pid_params = " ".join(["/PID " + pid for pid in not_respond_list])
os.popen("taskkill /F " + pid_params)
if len(list_process(process_name)) <= 0:
start_program(r'E:\xx\xx.exe')
}
进程列表查找方法
list_process函数用于查找符合特定条件的进程列表。通过构造tasklist命令,指定镜像名称(IMAGENAME)和可选的状态条件(STATUS eq Not Responding),调用os.popen执行命令并解析输出。
def list_process(process_name, not_respond=False):
cmd = 'tasklist /FI "IMAGENAME eq %s"'
if not_respond:
cmd = cmd + ' /FI "STATUS eq Not Responding"'
output = os.popen(cmd % process_name)
return parse_output(output.read())
def list_not_response(process_name):
return list_process(process_name, True)
输出结果解析
parse_output函数负责解析tasklist命令返回的文本输出。它跳过前两行标题,遍历剩余每一行,提取第二列(PID)存入列表并返回。
def parse_output(output):
print(output)
pid_list = []
lines = output.strip().split("\n")
if len(lines) > 2:
for line in lines[2:]:
pid_list.append(line.split()[1])
return pid_list
tasklist输出示例
tasklist命令的典型输出包含映像名称、PID、会话名、会话#及内存使用等列。例如,某进程WizChromeProcess.exe的PID为1620,内存使用32,572 K。脚本通过解析此格式提取PID。
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
WizChromeProcess.exe 1620 Console 1 32,572 K
完整代码实现
以下是完整的Python脚本代码,整合了上述所有功能模块。
import os
import time
import schedule
def parse_output(output):
print(output)
pid_list = []
lines = output.strip().split("\n")
if len(lines) > 2:
for line in lines[2:]:
pid_list.append(line.split()[1])
return pid_list
def list_not_response(process_name):
return list_process(process_name, True)
def list_process(process_name, not_respond=False):
cmd = 'tasklist /FI "IMAGENAME eq %s"'
if not_respond:
cmd = cmd + ' /FI "STATUS eq Not Responding"'
output = os.popen(cmd % process_name)
return parse_output(output.read())
def start_program(program):
os.popen(program)
def check_job():
process_name = "xx.exe"
not_respond_list = list_not_response(process_name)
if len(not_respond_list) <= 0:
return
pid_params = " ".join(["/PID " + pid for pid in not_respond_list])
os.popen("taskkill /F " + pid_params)
if len(list_process(process_name)) <= 0:
start_program(r'E:\xxx\xx.exe')
if __name__ == '__main__':
schedule.every(5).seconds.do(check_job)
while True:
schedule.run_pending()
time.sleep(1)
总结
该脚本通过定时轮询和系统命令调用,实现了Windows下无响应进程的自动检测与重启。对于经常卡死且需保持运行的Windows程序,此方案提供了稳定的后台保障。
以上介绍了Python定时检测无响应进程并重启的实例代码,希望能为遇到类似问题的读者提供帮助。如有疑问欢迎留言,小编会及时回复。感谢对本站的支持!若觉得本文有用,欢迎转载,请注明出处,谢谢!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









