python实现简易内存监控
本例主要功能:每隔3秒获取系统内存,当内存超过设定的警报值时,获取所有进程占用内存并发出警报声。内存值和所有进程占用内存记入log,log文件按天命名。
1获取cpu、内存、进程信息
利用WMI
简单说明下,WMI的全称是WindowsManagementInstrumentation,即Windows管理规范。它是Windows操作系统上管理数据和操作的基础设施。我们可以使用WMI脚本或者应用自动化管理任务等。
安装模块
WMI下载地址
win32com下载地址:
学会使用WMI
不错的教程
获取cpu、内存、磁盘
defgetSysInfo(wmiService=None):
result={}
ifwmiService==None:
wmiService=wmi.WMI()
#cpu
forcpuinwmiService.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
fordiskinwmiService.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)
returnresult
获取所有进程占用内存
defgetAllProcessInfo(mywmi=None):
"""取出全部进程的进程名,进程ID,进程实际内存,虚拟内存,CPU使用率
"""
allProcessList=[]
allProcess=mywmi.ExecQuery("SELECT*FROMWin32_PerfFormattedData_PerfProc_Process")
#print(allProcess.count)
forjinallProcess:
#printj.Properties_("PercentPrivilegedTime").__int__()
##printj.Properties_("name").__str__()+""+j.Properties_("IDProcess").__str__()+""+j.Properties_("PercentPrivilegedTime").__str__()
#forproinj.Properties_:
#print(pro.name)
#break
name=j.Properties_("name").__str__()
ifname!="_Total"andname!="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])
returnallProcessList
也可以用psutil
importpsutil,time fromoperatorimportitemgetter,attrgetter defgetProcessInfo(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 exceptpsutil.Error: name="Closed_Process" pid=0 rss=0 vms=0 cpu=0 #return[name.upper(),pid,rss,vms] return[name,pid,vms,rss,cpu] defgetAllProcessInfo(): """取出全部进程的进程名,进程ID,进程实际内存,虚拟内存,CPU使用率 """ instances=[] all_processes=list(psutil.process_iter()) forprocinall_processes: proc.cpu_percent(interval=0) #此处sleep1秒是取正确取出CPU使用率的重点 time.sleep(1) forprocinall_processes: instances.append(getProcessInfo(proc)) returninstances if__name__=='__main__': processInfoList=getAllProcessInfo() processInfoList.sort(key=itemgetter(2),reverse=True) forpinprocessInfoList: 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
importlogging
importlogging.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
importwmi
importtime
importwinsound
importlogging
importlogging.config
fromoperatorimportitemgetter,attrgetter
fromosimportpath
importpackages.sysinfo#使用wmi
#importpackages.ProcessInfo#使用
#defShowProcessInfo():
#processInfoList=packages.ProcessInfo.getAllProcessInfo()
#processInfoList.sort(key=itemgetter(2),reverse=True)
#forpinprocessInfoList:
#logger.info(p)
defShowProcessInfo(wmiService=None):
processInfoList=packages.sysinfo.getAllProcessInfo(wmiService)
processInfoList.sort(key=itemgetter(2),reverse=True)
forpinprocessInfoList:
logger.info(p)
if__name__=='__main__':
MemPerWorningLine=50
MemPerErrorLine=20
ErrorAlertCount=10
ProcessInfoCount=10
counterProcessInfo=ProcessInfoCount
print("Memorymonitorstart!")
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()
whileTrue:
memPercent=int(packages.sysinfo.getSysInfo(wmiService)['memPercent'])
strMemPercent='FreeMemory:'+str(memPercent)+'%'
if(memPercent=ProcessInfoCount):
ShowProcessInfo(wmiService)
counterProcessInfo=0
#ALert
counter=1
whilecounter<=ErrorAlertCount:
winsound.Beep(2080,100)
time.sleep(0.1)
counter+=1
elif(memPercent=ProcessInfoCount):
ShowProcessInfo(wmiService)
counterProcessInfo=0
#ALert
winsound.Beep(2015,2000)
else:
logger.info(strMemPercent)
time.sleep(3)
sysinfo
#-*-coding:utf-8-*-
importwmi
importos
importsys
importplatform
importtime
importwin32api
importwin32com
fromwin32com.clientimportGetObject
fromoperatorimportitemgetter,attrgetter
defgetSysInfo(wmiService=None):
result={}
ifwmiService==None:
wmiService=wmi.WMI()
#cpu
forcpuinwmiService.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
fordiskinwmiService.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)
returnresult
defsys_version():
c=wmi.WMI()
#获取操作系统版本
forsysinc.Win32_OperatingSystem():
print("Version:%s"%sys.Caption.encode("UTF8"),"Vernum:%s"%sys.BuildNumber)
print(sys.OSArchitecture.encode("UTF8"))#系统是32位还是64位的
print(sys.NumberOfProcesses)#当前系统运行的进程总数
defcpu_mem():
c=wmi.WMI()
#CPU类型和内存
forprocessorinc.Win32_Processor():
#print"ProcessorID:%s"%processor.DeviceID
print("ProcessName:%s"%processor.Name.strip())
forMemoryinc.Win32_PhysicalMemory():
print("MemoryCapacity:%.fMB"%(int(Memory.Capacity)/1048576))
defcpu_use():
#5s取一次CPU的使用率
c=wmi.WMI()
whileTrue:
forcpuinc.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)
defdisk():
c=wmi.WMI()
#获取硬盘分区
forphysical_diskinc.Win32_DiskDrive():
forpartitioninphysical_disk.associators("Win32_DiskDriveToDiskPartition"):
forlogical_diskinpartition.associators("Win32_LogicalDiskToPartition"):
print(physical_disk.Caption.encode("UTF8"),partition.Caption.encode("UTF8"),logical_disk.Caption)
#获取硬盘使用百分情况
fordiskinc.Win32_LogicalDisk(DriveType=3):
print(disk.Caption,"%0.2f%%free"%(100.0*long(disk.FreeSpace)/long(disk.Size)))
defnetwork():
c=wmi.WMI()
#获取MAC和IP地址
forinterfaceinc.Win32_NetworkAdapterConfiguration(IPEnabled=1):
print("MAC:%s"%interface.MACAddress)
forip_addressininterface.IPAddress:
print("ip_add:%s"%ip_address)
print
#获取自启动程序的位置
forsinc.Win32_StartupCommand():
print("[%s]%s<%s>"%(s.Location.encode("UTF8"),s.Caption.encode("UTF8"),s.Command.encode("UTF8")))
#获取当前运行的进程
forprocessinc.Win32_Process():
print(process.ProcessId,process.Name)
defgetAllProcessInfo(mywmi=None):
"""取出全部进程的进程名,进程ID,内存(专有工作集),工作集
"""
allProcessList=[]
allProcess=mywmi.ExecQuery("SELECT*FROMWin32_PerfFormattedData_PerfProc_Process")
#print(allProcess.count)
forjinallProcess:
#printj.Properties_("PercentPrivilegedTime").__int__()
##printj.Properties_("name").__str__()+""+j.Properties_("IDProcess").__str__()+""+j.Properties_("PercentPrivilegedTime").__str__()
#forproinj.Properties_:
#print(pro.name)
#break
name=j.Properties_("name").__str__()
ifname!="_Total"andname!="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*fromWin32_Process")
#foriinallProcess:
#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])
returnallProcessList
#defmain():
#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)
forprocessinfoinprocessInfoList:
print(processinfo)
processinfo
importpsutil,time fromoperatorimportitemgetter,attrgetter defgetProcessInfo(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 exceptpsutil.Error: name="Closed_Process" pid=0 rss=0 vms=0 cpu=0 #return[name.upper(),pid,rss,vms] return[name,pid,vms,rss,cpu] defgetAllProcessInfo(): """取出全部进程的进程名,进程ID,进程实际内存,虚拟内存,CPU使用率 """ instances=[] all_processes=list(psutil.process_iter()) forprocinall_processes: proc.cpu_percent(interval=0) #此处sleep1秒是取正确取出CPU使用率的重点 time.sleep(1) forprocinall_processes: instances.append(getProcessInfo(proc)) returninstances if__name__=='__main__': processInfoList=getAllProcessInfo() processInfoList.sort(key=itemgetter(2),reverse=True) forpinprocessInfoList: 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。