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 相关文章推荐
Django的数据模型访问多对多键值的方法
Jul 21 Python
Django数据库类库MySQLdb使用详解
Apr 28 Python
Python异步操作MySQL示例【使用aiomysql】
May 16 Python
详解10个可以快速用Python进行数据分析的小技巧
Jun 24 Python
在python中实现调用可执行文件.exe的3种方法
Jul 07 Python
Python实现蒙特卡洛算法小实验过程详解
Jul 12 Python
Django urls.py重构及参数传递详解
Jul 23 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
pytorch 实现在预训练模型的 input上增减通道
Jan 06 Python
python轮询机制控制led实例
May 03 Python
Python中的With语句的使用及原理
Jul 29 Python
python 实现学生信息管理系统的示例
Nov 28 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
推荐文章系统(一)
2006/10/09 PHP
一周让你学会PHP 不错的学习资料
2009/02/06 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
onpropertypchange
2006/07/01 Javascript
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
html文本框提示效果的示例代码
2014/06/28 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
js图片轮播效果实现代码
2020/04/18 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
JavaScript中将数组进行合并的基本方法讲解
2016/03/07 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
jQuery实现的checkbox级联选择下拉菜单效果示例
2016/12/26 Javascript
jQuery插件版本冲突的处理方法分析
2017/01/16 Javascript
bootstrap multiselect下拉列表功能
2017/08/22 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
layui禁用侧边导航栏点击事件的解决方法
2019/09/25 Javascript
js实现前端界面导航栏下拉列表
2020/08/27 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
原生js实现购物车功能
2020/09/23 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
Python计算一个文件里字数的方法
2015/06/15 Python
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
Vision Direct比利时:在线订购隐形眼镜
2019/08/27 全球购物
物业品质提升方案
2014/06/08 职场文书
小学综合实践活动总结
2014/07/07 职场文书
一份文言文检讨书
2014/09/13 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
运动会广播稿100字
2015/08/19 职场文书
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python
Javascript webpack动态import
2022/04/19 Javascript