当前位置:   article > 正文

Python定时检测无响应进程并重启(Win/Linux)_python 识别程序是否未响应

python 识别程序是否未响应

可选的工具包:

  • schedule:定时任务调度库,如果多线程执行注意不要设置成死循环
  • psutil:跨平台库, 能够轻松实现获取系统运行的进程和系统利用率

schedule

  1. import schedule
  2. import time
  3. from datetime import datetime
  4. from schedule import every, repeat
  5. def job(name):
  6. print("name is : ", name)
  7. name = "scheduler"
  8. schedule.every(10).minutes.do(job, name)
  9. schedule.every().hour.do(job, name)
  10. schedule.every().day.at("10:30").do(job, name)
  11. schedule.every(5).to(10).days.do(job, name)
  12. schedule.every().monday.do(job, name)
  13. schedule.every().wednesday.at("13:15").do(job, name)
  14. @repeat(every(3).seconds)
  15. def task():
  16. now = datetime.now()
  17. ts = now.strftime("%Y-%m-%d %H:%M:%S")
  18. print(ts + '-333!')
  19. while True:
  20. schedule.run_pending()
  21. time.sleep(1)

psutil

  1. pids = psutil.pids()
  2. for pid in pids:
  3. p = psutil.Process(pid)
  4. # get process name according to pid
  5. process_name = p.name()
  6. print("Process name is: %s, pid is: %s" %(process_name, pid))

可以查看的进程信息:

p.name()   #进程名
p.exe()    #进程的bin路径
p.cwd()    #进程的工作目录绝对路径
p.status()   #进程状态
p.create_time()  #进程创建时间
p.uids()    #进程uid信息
p.gids()    #进程的gid信息
p.cpu_times()   #进程的cpu时间信息,包括user,system两个cpu信息
p.cpu_affinity()  #get进程cpu亲和度,如果要设置cpu亲和度,将cpu号作为参考就好
p.memory_percent()  #进程内存利用率
p.memory_info()    #进程内存rss,vms信息
p.io_counters()    #进程的IO信息,包括读写IO数字及参数
p.connections()   #返回进程对象的列表
p.num_threads()  #进程开启的线程数p.username()  #执行用户的名

Win和Linux下杀死进程的方法不同

  1. '''Windows'''
  2. #根据进程名杀死进程
  3. pro = 'taskill /f /im %s'% process_name
  4. os.system(pro)
  5. #根据pid杀死进程
  6. process = 'taskill /f /pid %s'%pid
  7. os.system(process)
  8. '''linux'''
  9. os.kill(pid, signal.SIGKILL)

Windows系统下定时检测无响应进程并重启

  1. import os
  2. import time
  3. import schedule
  4. def parse_output(output):
  5. print(output)
  6. pid_list = []
  7. lines = output.strip().split("\n")
  8. if len(lines) > 2:
  9. for line in lines[2:]:
  10. pid_list.append(line.split()[1])
  11. return pid_list
  12. def list_not_response(process_name):
  13. return list_process(process_name, True)
  14. def list_process(process_name, not_respond=False):
  15. cmd = 'tasklist /FI "IMAGENAME eq %s"'
  16. if not_respond:
  17. cmd = cmd + ' /FI "STATUS eq Not Responding"'
  18. output = os.popen(cmd % process_name)
  19. return parse_output(output.read())
  20. def start_program(program):
  21. os.popen(program)
  22. def check_job():
  23. process_name = "xx.exe"
  24. not_respond_list = list_not_response(process_name)
  25. if len(not_respond_list) <= 0:
  26. return
  27. pid_params = " ".join(["/PID " + pid for pid in not_respond_list])
  28. os.popen("taskkill /F " + pid_params)
  29. if len(list_process(process_name)) <= 0:
  30. start_program(r'E:\xxx\xx.exe')
  31. if __name__ == '__main__':
  32. schedule.every(5).seconds.do(check_job)
  33. while True:
  34. schedule.run_pending()
  35. time.sleep(1)

Linux系统下检测无响应进程并重启

  1. import subprocess
  2. import os
  3. import time
  4. # 启动进程并返回进程ID
  5. def start_process():
  6. p = subprocess.Popen(['python', 'your_script.py'])
  7. return p.pid
  8. # 监听进程状态
  9. def poll_process(pid, timeout=60):
  10. start_time = time.time()
  11. while time.time() - start_time < timeout:
  12. time.sleep(1)
  13. if os.kill(pid, 0) != 0:
  14. return False
  15. return True
  16. # 重启进程
  17. def restart_process():
  18. pid = start_process()
  19. return poll_process(pid)
  20. # 主函数,每分钟检测一次进程状态
  21. if __name__ == '__main__':
  22. pid = start_process()
  23. while True:
  24. if not poll_process(pid):
  25. print("Process not responding. Restarting...")
  26. os.kill(pid, signal.SIGTERM)
  27. pid = start_process()
  28. time.sleep(60)

其他检测程序无响应的思路

  • 比较CPU 和内存使用情况在两个时间点之间的差异以确定它们在这段时间内是否有响应
  1. import psutil
  2. import time
  3. #获取要检测的进程
  4. chrome_process = psutil.Process(2437)
  5. #获取进程的 CPU 和内存使用情况
  6. cpu_usage_before = chrome_process.cpu_percent(interval=1)
  7. memory_usage_before = chrome_process.memory_percent()
  8. #等待一段时间,再次获取
  9. time.sleep(5)
  10. cpu_usage_after = chrome_process.cpu_percent(interval=1)
  11. memory_usage_after = chrome_process.memory_percent()
  12. #比较两个时间点的 CPU 和内存使用情况,如果它们之间的差别很小,则说明进程在这段时间内保持响应状态。否则,进程可能已经出现了问题
  13. if abs(cpu_usage_after - cpu_usage_before) < 1 and abs(memory_usage_after - memory_usage_before) < 1:
  14. print("进程正常工作。")
  15. else:
  16. print("进程未响应。")

References

python练手脚本-定时检测无响应进程并重启 - 简书

python定时检测无响应进程并重启的实例代码 - Python技术站

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/72295
推荐阅读
相关标签
  

闽ICP备14008679号