脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - python监控进程脚本

python监控进程脚本

2021-01-30 00:32左边的天堂 Python

这篇文章主要为大家详细介绍了python监控进程脚本,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了python监控进程脚本的具体代码,供大家参考,具体内容如下

原理:

监控一个指定进程,每隔5秒钟获取其CPU、内存使用量超过60%即kill掉该进程,获取其句柄数,超过300也kill掉该进程

运行环境是windows 64位系统+python 2.7 64位 ,这里需要使用到psutil 类库,要另外安装。脚本里面可以自动安装,前提是你已经下载好了安装包psutil-3.3.0.win-amd64-py2.7.exe

下面看代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
 
import time
from datetime import date, datetime, timedelta
import platform
import os
import win32ui,win32api,win32con,win32gui
import subprocess
 
 
def install():
 print("install psutil...")
 sysstr = platform.system()
 if(sysstr =="Windows"):
  print ("Call Windows tasks")
  bit,type=platform.architecture()
  print ("os bit: %s " % bit)
  #print ("os type: %s " % type)
  if(bit == "64bit"):
   fileName="psutil-3.3.0.win-amd64-py2.7.exe";
  else:
   fileName="psutil-3.3.0.win32-py2.7.exe";
  print("will install the file [%s]" % fileName)
   
  #启动程序--4种方法
  #subprocess.Popen(fileName); #非阻塞
  #subprocess.Popen(fileName).wati(); #阻塞  
  #os.system(fileName); #阻塞
  #win32api.ShellExecute(0, 'open', fileName, '','',0)
   
  label = 'Setup' #此处假设主窗口名为tt
  hld = win32gui.FindWindow(None, label)  
  count=0
  while (hld == 0 and count<20):
   print("the setup is no running,will run it...")
   count += 1
   win32api.ShellExecute(0, 'open', fileName, '','',0)   
   print("sleep 1 seconds...")
   time.sleep(0.5)
   #wnd = win32ui.GetForegroundWindow()
   #print wnd.GetWindowText()
   hld = win32gui.FindWindow(None, label)
   print("hld is %s" % hld)
   
  pwin=win32ui.FindWindow(None,label)  
  print("pwin is %s" % pwin)
  print pwin.GetWindowText()
  print("click...")
  button2=win32ui.FindWindowEx(pwin,None,None,'下一步(&N) >') #找到按钮
  button2.SendMessage(win32con.BM_CLICK, 0,-1)
  button2=win32ui.FindWindowEx(pwin,None,None,'下一步(&N) >') #找到按钮
  button2.SendMessage(win32con.BM_CLICK, 0,-1)
  button2=win32ui.FindWindowEx(pwin,None,None,'下一步(&N) >') #找到按钮
  button2.SendMessage(win32con.BM_CLICK, 0,-1)
  button2=win32ui.FindWindowEx(pwin,None,None,'完成') #找到按钮
  button2.SendMessage(win32con.BM_CLICK, 0,-1)
  print("install done...")
 
 
  # 鼠标点击
  #print("click...")
  #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
  #time.sleep(0.1)
  #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
  #time.sleep(1)
  #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
  #time.sleep(0.1)
  #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
  #time.sleep(1)
  #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
  #time.sleep(0.1)
  #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
  #time.sleep(1)
  #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
  #time.sleep(0.1)
  #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
   
 elif(sysstr == "Linux"):
  print ("Call Linux tasks")
 else:
  print ("Other System tasks")
   
try:
 print("import psutil...")
 import psutil 
except Exception,e:
 print Exception,":",e
 install()
 import psutil
 
 
 
def get_proc_by_id(pid):
 return psutil.Process(pid)
 
 
def get_proc_by_name(pname):
 """ get process by name
  
 return the first process if there are more than one
 """
 for proc in psutil.process_iter():
  try:
<span style="white-space:pre">   </span># return if found one
   if proc.name().lower() == pname.lower():<span style="white-space:pre">   </span>
    return proc<span style="white-space:pre">    </span>
  except psutil.AccessDenied:
   pass
  except psutil.NoSuchProcess:
   pass
 return None
 
 
 
 
def getProcess(pname, day=0, hour=0, min=0, second=0): 
 # Init time
 now = datetime.now()
 strnow = now.strftime('%Y-%m-%d %H:%M:%S')
 print "now:",strnow
 # First next run time
 period = timedelta(days=day, hours=hour, minutes=min, seconds=second)
 next_time = now + period
 strnext_time = next_time.strftime('%Y-%m-%d %H:%M:%S')
 print "next run time:",strnext_time
 while True:
  # Get system current time
  iter_now = datetime.now()
  iter_now_time = iter_now.strftime('%Y-%m-%d %H:%M:%S'
  if str(iter_now_time) == str(strnext_time):
   next_time = iter_now + period
   strnext_time = next_time.strftime('%Y-%m-%d %H:%M:%S')
   print "next run time:",strnext_time
    
   try:
    Process=get_proc_by_name(pname)
   except Exception,e:
    print Exception,":",e
   if Process != None :
    print "-------Found the process : %s" % Process.name();
    print("pid is (%s)" % Process.pid);
    Cpu_usage = Process.cpu_percent(interval=1)
    print("cpu percent is (%s)" % Cpu_usage);
    if (100-Cpu_usage) < 0.1 :
     print "cpu percent larger 60,now will terminate this process !";
     Process.terminate();
     Process.wait(timeout=3);
     continue
    RAM_percent = Process.memory_percent()
    print("memory percent is (%s)" % RAM_percent);
    if (60-RAM_percent) < 0.1 :
     print "memory percent larger 60,now will terminate this process !";
     Process.terminate();
     Process.wait(timeout=3);
     continue  
    all_files = list(Process.open_files());
    print("open files size is (%d)" % len(all_files));
    if (len(all_files)>300) :
     print "open files size larger 300,now will terminate this process !";
     Process.terminate();
     Process.wait(timeout=3);
     continue
    Threads_Num=Process.num_threads()
    print("threads number is (%s)" % Threads_Num);
    if (Threads_Num>200) :
     print "threads number larger 200,now will terminate this process !";
     Process.terminate();
     Process.wait(timeout=3);
     continue
   else :
    print "-------No found the process : %s" % pname;
    
   continue
 
 
if __name__ == '__main__':
 print("main....")
 getProcess("QQ.exe",second=5)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/tiantang_1986/article/details/50433882

延伸 · 阅读

精彩推荐