Python实现Windows下无响应进程自动检测与重启

木白
木白
发布时间:2026-10-13| 3人浏览过
原创

本文介绍使用Python脚本在Windows平台上自动检测无响应进程并重启的方法。通过schedule库实现定时调度,利用os.popen执行tasklist命令筛选状态为“无响应”的进程,获取PID后强制结束并重新启动程序。适用于需要保持长期运行但偶尔卡死的Windows应用程序场景。

Windows无响应进程自动重启方案

在Windows平台运行某些程序时,常出现因资源占用或逻辑缺陷导致的无响应问题。虽然这些程序不可或缺,但每次发现卡死都需手动重启,效率低下。为此,编写一个自动化脚本,定期检测进程状态并在无响应时自动重启,成为提升稳定性的有效手段。

核心技术点

实现该功能主要涉及以下核心技术点:

  1. 使用schedule库进行定时任务调度,设定检查周期。
  2. 利用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定时检测无响应进程并重启的实例代码,希望能为遇到类似问题的读者提供帮助。如有疑问欢迎留言,小编会及时回复。感谢对本站的支持!若觉得本文有用,欢迎转载,请注明出处,谢谢!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。