本例主要功能:每隔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, attrgetterdef 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.TimedRotatingFileHandlerlevel=DEBUGformatter=form01args=('./logs/monitor.log', 'd', 1, 7)[formatters]keys=form01,form02[formatter_form01]format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)sdatefmt=%Y-%m-%d %H:%M:%S
记录log
import loggingimport logging.configlogger.info("message")logger.warning("message")logger.error("message")
3. 完整代码
文件夹结构:
maintain