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中使用Mako模版库的简单教程
Apr 08 Python
Python使用剪切板的方法
Jun 06 Python
基于数据归一化以及Python实现方式
Jul 11 Python
Python爬虫之正则表达式的使用教程详解
Oct 25 Python
Python实现针对json中某个关键字段进行排序操作示例
Dec 25 Python
使用python实现滑动验证码功能
Aug 05 Python
python tkinter canvas使用实例
Nov 04 Python
python之生成多层json结构的实现
Feb 27 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
May 09 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
用python读取xlsx文件
Dec 17 Python
分享python函数常见关键字
Apr 26 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
PHP获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
cakephp常见知识点汇总
2017/02/24 PHP
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
探讨JavaScript中声明全局变量三种方式的异同
2013/12/03 Javascript
js实现圆盘记速表
2015/08/03 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
2017/01/12 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
javascript实现鼠标点击生成文字特效
2019/12/24 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
JavaScript实现放大镜效果代码示例
2020/04/29 Javascript
Python正则表达式教程之一:基础篇
2017/03/02 Python
pandas把所有大于0的数设置为1的方法
2019/01/26 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
python绘制玫瑰的实现代码
2020/03/02 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
Coccinelle官网:意大利的著名皮具品牌
2019/05/15 全球购物
小学家长会邀请函
2014/01/23 职场文书
广告创意求职信
2014/03/17 职场文书
《春天来了》教学反思
2014/04/07 职场文书
大学生评语大全
2014/04/18 职场文书
销售目标责任书
2014/07/23 职场文书
国际会计专业求职信
2014/08/04 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书