python实现简易内存监控


Posted in Python onJune 21, 2018

本例主要功能:每隔3秒获取系统内存,当内存超过设定的警报值时,获取所有进程占用内存并发出警报声。内存值和所有进程占用内存记入log,log文件按天命名。

1 获取cpu、内存、进程信息

利用WMI

简单说明下,WMI的全称是Windows Management Instrumentation,即Windows管理规范。它是Windows操作系统上管理数据和操作的基础设施。我们可以使用WMI脚本或者应用自动化管理任务等。

安装模块

WMI下载地址
win32com下载地址:

学会使用WMI

不错的教程

获取cpu、内存、磁盘

def getSysInfo(wmiService = None):
 result = {}
 if wmiService == None:
  wmiService = wmi.WMI()
 # cpu
 for cpu in wmiService.Win32_Processor():
  timestamp = time.strftime('%a, %d %b %Y %H:%M:%S', time.localtime())
  result['cpuPercent'] = cpu.loadPercentage
 # memory
 cs = wmiService.Win32_ComputerSystem()
 os = wmiService.Win32_OperatingSystem()
 result['memTotal'] = int(int(cs[0].TotalPhysicalMemory)/1024/1024)
 result['memFree'] = int(int(os[0].FreePhysicalMemory)/1024)
 result['memPercent']=result['memFree'] * 100 /result['memTotal']
 #disk
 result['diskTotal'] = 0
 result['diskFree'] = 0
 for disk in wmiService.Win32_LogicalDisk(DriveType=3):
  result['diskTotal'] += int(disk.Size)
  result['diskFree'] += int(disk.FreeSpace)
 result['diskTotal'] = int(result['diskTotal']/1024/1024)
 result['diskFree'] = int(result['diskFree']/1024/1024)
 return result

获取所有进程占用内存

def getAllProcessInfo(mywmi = None): 
 """取出全部进程的进程名,进程ID,进程实际内存, 虚拟内存,CPU使用率 
 """ 
 allProcessList = []

 allProcess = mywmi.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfProc_Process")
 #print (allProcess.count)
 for j in allProcess:
  #print j.Properties_("PercentPrivilegedTime").__int__()
  ##print j.Properties_("name").__str__()+" "+j.Properties_("IDProcess").__str__()+" "+j.Properties_("PercentPrivilegedTime").__str__()
  #for pro in j.Properties_:
  # print (pro.name)
  #break
  name = j.Properties_("name").__str__()
  if name != "_Total" and name !="Idle":
   pid = j.Properties_("IDProcess").__str__()
   PercentPrivilegedTime = j.Properties_("PercentPrivilegedTime").__int__()
   WorkingSetPrivate = j.Properties_("WorkingSetPrivate").__int__()/1024
   WorkingSet = j.Properties_("WorkingSet").__int__()/1024
   allProcessList.append([name, pid, WorkingSetPrivate, WorkingSet, PercentPrivilegedTime])

 return allProcessList

也可以用psutil

import psutil,time 
from operator import itemgetter, attrgetter

def getProcessInfo(p): 
 """取出指定进程占用的进程名,进程ID,进程实际内存, 虚拟内存,CPU使用率 
 """ 
 try: 
  cpu = int(p.cpu_percent(interval=0)) 
  memory = p.memory_info() 
  rss = memory.rss/1024
  vms = memory.vms/1024
  name = p.name() 
  pid = p.pid 
 except psutil.Error: 
  name = "Closed_Process" 
  pid = 0 
  rss = 0 
  vms = 0 
  cpu = 0 
 #return [name.upper(), pid, rss, vms] 
 return [name, pid, vms, rss, cpu] 

def getAllProcessInfo(): 
 """取出全部进程的进程名,进程ID,进程实际内存, 虚拟内存,CPU使用率 
 """ 
 instances = [] 
 all_processes = list(psutil.process_iter()) 
 for proc in all_processes: 
  proc.cpu_percent(interval=0) 
 #此处sleep1秒是取正确取出CPU使用率的重点 
 time.sleep(1) 
 for proc in all_processes: 
  instances.append(getProcessInfo(proc)) 
 return instances 


if __name__ == '__main__': 
 processInfoList = getAllProcessInfo()
 processInfoList.sort(key=itemgetter(2), reverse=True)
 for p in processInfoList:
  print(p)

2. 保存log

配置config文件

[loggers]
keys=example01
[logger_example01]
handlers=hand04

[handlers]
keys=hand04
[handler_hand04]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=form01
args=('./logs/monitor.log', 'd', 1, 7)

[formatters]
keys=form01,form02
[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S

记录log

import logging
import logging.config

logger.info("message")
logger.warning("message")
logger.error("message")

3. 完整代码

文件夹结构:

maintain
?monitor
—-logs
—-logger.conf
—-monitor.py
?packages
—-init.py
—-processinfo.py
—-sysinfo.py

monitor

import wmi 
import time
import winsound 
import logging
import logging.config
from operator import itemgetter, attrgetter
from os import path

import packages.sysinfo #使用wmi
#import packages.ProcessInfo #使用

#def ShowProcessInfo():
# processInfoList = packages.ProcessInfo.getAllProcessInfo()
# processInfoList.sort(key=itemgetter(2), reverse=True)
# for p in processInfoList:  
#  logger.info(p)

def ShowProcessInfo(wmiService = None):
 processInfoList = packages.sysinfo.getAllProcessInfo(wmiService)
 processInfoList.sort(key=itemgetter(2), reverse=True)
 for p in processInfoList:  
  logger.info(p)

if __name__ == '__main__':
 MemPerWorningLine = 50
 MemPerErrorLine = 20
 ErrorAlertCount = 10
 ProcessInfoCount = 10
 counterProcessInfo = ProcessInfoCount

 print("Memory monitor start!")
 log_file_path = path.join(path.dirname(path.abspath(__file__)), 'logger.conf')
 #print(log_file_path)
 logging.config.fileConfig(log_file_path)
 logger = logging.getLogger("example01")
 wmiService = wmi.WMI()
 while True:
  memPercent = int(packages.sysinfo.getSysInfo(wmiService)['memPercent'])
  strMemPercent = 'FreeMemory: ' + str(memPercent) + '%'
  if(memPercent < MemPerErrorLine):
   logger.error(strMemPercent)
   #ProcessInfoList
   counterProcessInfo+=1
   if(counterProcessInfo >= ProcessInfoCount):
    ShowProcessInfo(wmiService)
    counterProcessInfo = 0
   #ALert
   counter = 1
   while counter <= ErrorAlertCount:
    winsound.Beep(2080, 100) 
    time.sleep(0.1)
    counter += 1
  elif(memPercent < MemPerWorningLine):
   logger.warning(strMemPercent)
   #ProcessInfoList
   counterProcessInfo+=1
   if(counterProcessInfo >= ProcessInfoCount):
    ShowProcessInfo(wmiService)
    counterProcessInfo = 0
   #ALert
   winsound.Beep(2015, 2000) 
  else:
   logger.info(strMemPercent)
  time.sleep(3)

sysinfo

# -*- coding: utf-8 -*-

import wmi 
import os 
import sys 
import platform 
import time 
import win32api
import win32com
from win32com.client import GetObject
from operator import itemgetter, attrgetter

def getSysInfo(wmiService = None):
 result = {}
 if wmiService == None:
  wmiService = wmi.WMI()
 # cpu
 for cpu in wmiService.Win32_Processor():
  timestamp = time.strftime('%a, %d %b %Y %H:%M:%S', time.localtime())
  result['cpuPercent'] = cpu.loadPercentage
 # memory
 cs = wmiService.Win32_ComputerSystem()
 os = wmiService.Win32_OperatingSystem()
 result['memTotal'] = int(int(cs[0].TotalPhysicalMemory)/1024/1024)
 result['memFree'] = int(int(os[0].FreePhysicalMemory)/1024)
 result['memPercent']=result['memFree'] * 100 /result['memTotal']
 #disk
 result['diskTotal'] = 0
 result['diskFree'] = 0
 for disk in wmiService.Win32_LogicalDisk(DriveType=3):
  result['diskTotal'] += int(disk.Size)
  result['diskFree'] += int(disk.FreeSpace)
 result['diskTotal'] = int(result['diskTotal']/1024/1024)
 result['diskFree'] = int(result['diskFree']/1024/1024)
 return result

def sys_version(): 
 c = wmi.WMI () 
 #获取操作系统版本 
 for sys in c.Win32_OperatingSystem(): 
  print ("Version:%s" % sys.Caption.encode("UTF8"),"Vernum:%s" % sys.BuildNumber)
  print (sys.OSArchitecture.encode("UTF8"))#系统是32位还是64位的 
  print (sys.NumberOfProcesses) #当前系统运行的进程总数

def cpu_mem(): 
 c = wmi.WMI ()  
 #CPU类型和内存 
 for processor in c.Win32_Processor(): 
  #print "Processor ID: %s" % processor.DeviceID 
  print ("Process Name: %s" % processor.Name.strip() )
 for Memory in c.Win32_PhysicalMemory(): 
  print ("Memory Capacity: %.fMB" %(int(Memory.Capacity)/1048576))

def cpu_use(): 
 #5s取一次CPU的使用率 
 c = wmi.WMI() 
 while True: 
  for cpu in c.Win32_Processor(): 
    timestamp = time.strftime('%a, %d %b %Y %H:%M:%S', time.localtime()) 
    print ('%s | Utilization: %s: %d %%' % (timestamp, cpu.DeviceID, cpu.LoadPercentage)) 
    time.sleep(5) 

def disk(): 
 c = wmi.WMI () 
 #获取硬盘分区 
 for physical_disk in c.Win32_DiskDrive (): 
  for partition in physical_disk.associators ("Win32_DiskDriveToDiskPartition"): 
   for logical_disk in partition.associators ("Win32_LogicalDiskToPartition"): 
    print (physical_disk.Caption.encode("UTF8"), partition.Caption.encode("UTF8"), logical_disk.Caption)

 #获取硬盘使用百分情况 
 for disk in c.Win32_LogicalDisk (DriveType=3): 
  print (disk.Caption, "%0.2f%% free" % (100.0 * long (disk.FreeSpace) / long (disk.Size)))

def network(): 
 c = wmi.WMI ()  
 #获取MAC和IP地址 
 for interface in c.Win32_NetworkAdapterConfiguration (IPEnabled=1): 
  print ("MAC: %s" % interface.MACAddress )
 for ip_address in interface.IPAddress: 
  print ("ip_add: %s" % ip_address )
 print

 #获取自启动程序的位置 
 for s in c.Win32_StartupCommand (): 
  print ("[%s] %s <%s>" % (s.Location.encode("UTF8"), s.Caption.encode("UTF8"), s.Command.encode("UTF8"))) 


 #获取当前运行的进程 
 for process in c.Win32_Process (): 
  print (process.ProcessId, process.Name)

def getAllProcessInfo(mywmi = None): 
 """取出全部进程的进程名,进程ID,内存(专有工作集), 工作集
 """ 
 allProcessList = []

 allProcess = mywmi.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfProc_Process")
 #print (allProcess.count)
 for j in allProcess:
  #print j.Properties_("PercentPrivilegedTime").__int__()
  ##print j.Properties_("name").__str__()+" "+j.Properties_("IDProcess").__str__()+" "+j.Properties_("PercentPrivilegedTime").__str__()
  #for pro in j.Properties_:
  # print (pro.name)
  #break
  name = j.Properties_("name").__str__()
  if name != "_Total" and name !="Idle":
   pid = j.Properties_("IDProcess").__str__()
   PercentPrivilegedTime = j.Properties_("PercentPrivilegedTime").__int__()
   WorkingSetPrivate = j.Properties_("WorkingSetPrivate").__int__()/1024
   WorkingSet = j.Properties_("WorkingSet").__int__()/1024
   allProcessList.append([name, pid, WorkingSetPrivate, WorkingSet, PercentPrivilegedTime])

# allProcess = mywmi.ExecQuery("select * from Win32_Process")
# for i in allProcess:
#  Name = str(i.Properties_("Name"))
#  ProcessID = int(i.Properties_("ProcessID"))
#  WorkingSetSize = int(i.Properties_("WorkingSetSize"))/1024
#  #VirtualSize = int(i.Properties_("VirtualSize"))/1024
#  PeakWorkingSetSize = int(i.Properties_("PeakWorkingSetSize"))/1024
#  CreationDate = str(i.Properties_("CreationDate"))
#  allProcessList.append([Name, ProcessID, WorkingSetSize, PeakWorkingSetSize, CreationDate])

 return allProcessList

#def main(): 
 #sys_version() 
 #cpu_mem() 
 #disk() 
 #network() 
 #cpu_use()

if __name__ == '__main__': 
 #mywmi = GetObject("winmgmts:")
 mywmi = wmi.WMI()
 processInfoList = getAllProcessInfo(mywmi)
 processInfoList.sort(key=itemgetter(2), reverse=True)
 for processinfo in processInfoList:
  print(processinfo)

processinfo

import psutil,time 
from operator import itemgetter, attrgetter

def getProcessInfo(p): 
 """取出指定进程占用的进程名,进程ID,进程实际内存, 虚拟内存,CPU使用率 
 """ 
 try: 
  cpu = int(p.cpu_percent(interval=0)) 
  memory = p.memory_info() 
  rss = memory.rss/1024
  vms = memory.vms/1024
  name = p.name() 
  pid = p.pid 
 except psutil.Error: 
  name = "Closed_Process" 
  pid = 0 
  rss = 0 
  vms = 0 
  cpu = 0 
 #return [name.upper(), pid, rss, vms] 
 return [name, pid, vms, rss, cpu] 

def getAllProcessInfo(): 
 """取出全部进程的进程名,进程ID,进程实际内存, 虚拟内存,CPU使用率 
 """ 
 instances = [] 
 all_processes = list(psutil.process_iter()) 
 for proc in all_processes: 
  proc.cpu_percent(interval=0) 
 #此处sleep1秒是取正确取出CPU使用率的重点 
 time.sleep(1) 
 for proc in all_processes: 
  instances.append(getProcessInfo(proc)) 
 return instances 


if __name__ == '__main__': 
 processInfoList = getAllProcessInfo()
 processInfoList.sort(key=itemgetter(2), reverse=True)
 for p in processInfoList:
  print(p)

logger

#logger.conf
###############################################
[loggers]
keys=root,example01,example02
[logger_root]
level=DEBUG
handlers=hand01,hand02
[logger_example01]
handlers=hand01,hand04
qualname=example01
propagate=0
[logger_example02]
handlers=hand01,hand03
qualname=example02
propagate=0
###############################################
[handlers]
keys=hand01,hand02,hand03,hand04
[handler_hand01]
class=StreamHandler
level=INFO
formatter=form02
args=(sys.stderr,)
[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form01
args=('myapp.log', 'a')
[handler_hand03]
class=handlers.RotatingFileHandler
level=INFO
formatter=form02
args=('myapp.log', 'a', 10*1024*1024, 5)
[handler_hand04]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=form01
args=('./logs/monitor.log', 'd', 1, 7)
###############################################
[formatters]
keys=form01,form02
[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S
[formatter_form02]
format=%(asctime)-12s: %(levelname)-8s %(message)s
datefmt=%Y-%m-%d %H:%M:%S

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python发布模块的步骤分享
Feb 21 Python
python获取远程图片大小和尺寸的方法
Mar 26 Python
python3获取两个日期之间所有日期,以及比较大小的实例
Apr 08 Python
Python UnboundLocalError和NameError错误根源案例解析
Oct 31 Python
Python 使用Numpy对矩阵进行转置的方法
Jan 28 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
Python3 hashlib密码散列算法原理详解
Mar 30 Python
Django后端分离 使用element-ui文件上传方式
Jul 12 Python
利用python对excel中一列的时间数据更改格式操作
Jul 14 Python
python本地文件服务器实例教程
May 02 Python
如何用python清洗文件中的数据
Jun 18 Python
Python实现的微信好友数据分析功能示例
Jun 21 #Python
python skimage 连通性区域检测方法
Jun 21 #Python
python3实现windows下同名进程监控
Jun 21 #Python
python检测主机的连通性并记录到文件的实例
Jun 21 #Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 #Python
python实现自动发送报警监控邮件
Jun 21 #Python
Python中list查询及所需时间计算操作示例
Jun 21 #Python
You might like
一个SQL管理员的web接口
2006/10/09 PHP
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
js的逻辑运算符 ||
2010/05/31 Javascript
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
Bootstrap每天必学之栅格系统(布局)
2015/11/25 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
jQuery EasyUi实战教程之布局篇
2016/01/26 Javascript
js以分隔符分隔数组中的元素并转换为字符串的方法
2016/11/16 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
Vue实现移动端拖拽交换位置
2020/07/29 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
Python日志处理模块logging用法解析
2020/05/19 Python
python excel多行合并的方法
2020/12/09 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
生产主管岗位职责
2013/11/10 职场文书
宿舍违规用电检讨书
2014/02/16 职场文书
构建高效课堂实施方案
2014/03/13 职场文书
成绩单公证书
2014/04/10 职场文书
大学生见习期满自我鉴定
2014/09/13 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
发布会邀请函
2015/01/31 职场文书
导游词之山东孔庙
2019/11/04 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
MySQL如何解决幻读问题
2021/08/07 MySQL
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏