代码讲解Python对Windows服务进行监控
我们首先来看下python的全部代码,大家可以直接复制后测试:
#-*-encoding:utf-8-*- importlogging importwmi importos importtime fromConfigParserimportConfigParser importsmtplib fromemail.mime.textimportMIMEText importsocket fromdatetimeimportdatetime importre importsys importtime importstring importpsutil importthreading fromthreadingimportTimer importlogging #创建一个logger logger=logging.getLogger('Monitor') logger.setLevel(logging.DEBUG) #创建一个handler,用于写入日志文件 fh=logging.FileHandler('test.log') fh.setLevel(logging.DEBUG) formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s') fh.setFormatter(formatter) logger.addHandler(fh) reload(sys)#Python2.5初始化后会删除sys.setdefaultencoding这个方法,我们需要重新载入 sys.setdefaultencoding('utf-8') defsend_mail(to_list,sub,content): CONFIGFILE='config.ini' config=ConfigParser() config.read(CONFIGFILE) mail_host=config.get('Mail','mail_host')#使用的邮箱的smtp服务器地址,这里是163的smtp地址 mail_user=config.get('Mail','mail_user')#用户名 mail_pass=config.get('Mail','mail_pass')#密码 mail_postfix=config.get('Mail','mail_postfix')#邮箱的后缀,网易就是163.com me=sub+"<"+mail_user+"@"+mail_postfix+">" msg=MIMEText(content,_subtype='plain',_charset='utf-8') msg['Subject']=sub msg['From']=me msg['To']=";".join(to_list)#将收件人列表以‘;'分隔 try: server=smtplib.SMTP() server.connect(mail_host)#连接服务器 server.login(mail_user,mail_pass)#登录操作 server.sendmail(me,to_list,msg.as_string()) server.close() returnTrue exceptException,e: printstr(e) logger.info(str(e)) returnFalse #读取配置文件中的进程名和系统路径,这2个参数都可以在配置文件中修改 ProList=[] #定义一个列表 c=wmi.WMI() #获取进程所用内存 defcountProcessMemoey(processName): try: CONFIGFILE='config.ini' config=ConfigParser() config.read(CONFIGFILE) pattern=re.compile(r'([^\s]+)\s+(\d+)\s.*\s([^\s]+\sK)') cmd='tasklist/fi"imagenameeq'+processName+'"'+'|findstr.exe'+processName result=os.popen(cmd).read() resultList=result.split("\n") totalMem=0.0 totalCpu=0.0 print"*"*80 forsrcLineinresultList: srcLine="".join(srcLine.split('\n')) iflen(srcLine)==0: break m=pattern.search(srcLine) ifm==None: continue #由于是查看python进程所占内存,因此通过pid将本程序过滤掉 ifstr(os.getpid())==m.group(2): continue p=psutil.Process(int(m.group(2))) cpu=p.cpu_percent(interval=1) ori_mem=m.group(3).replace(',','') ori_mem=ori_mem.replace('K','') ori_mem=ori_mem.replace(r'\sK','') memEach=string.atoi(ori_mem) totalMem+=(memEach*1.0/1024) totalCpu+=cpu print'ProcessName:'+m.group(1)+'\tPID:'+m.group(2)+'\tmemorysize:%.2f'%(memEach*1.0/1024),'M'+'CPU:'+str(cpu)+'%' print'ProcessName:'+m.group(1)+'TotalMemory:'+str(totalMem)+'M'+'totalCPU:'+str(totalCpu)+'%' logger.info('ProcessName:'+m.group(1)+'TotalMemory:'+str(totalMem)+'M'+'totalCPU:'+str(totalCpu)+'%') print"*"*80 iftotalMem>float(config.get('MonitorProcessValue','Memory')): print'MemoryExceed!' IP=socket.gethostbyname(socket.gethostname()) now=datetime.now().strftime('%Y-%m-%d%H:%M:%S') subject=IP+''+processName+'内存使用量过高!' content=now+''+IP+''+processName+'内存使用量过高,达到'+str(totalMem)+'M\n请尽快处理!' logger.info(processName+'内存使用量过高,达到'+str(totalMem)+'M') send_mail(['sunwei_work@163.com','sunweiworkplace@gmail.com'],subject,content) iftotalCpu>float(config.get('MonitorProcessValue','CPU')): print'CPUExceed!' IP=socket.gethostbyname(socket.gethostname()) now=datetime.now().strftime('%Y-%m-%d%H:%M:%S') subject=IP+''+processName+'CPU使用率过高!' content=now+''+IP+''+processName+'CPU使用率过高,达到'+str(totalCpu)+'%\n请尽快处理!' logger.info(processName+'CPU使用率过高,达到'+str(totalMem)+'M') send_mail(['sunwei_work@163.com','sunweiworkplace@gmail.com'],subject,content) exceptException,e: printstr(e) logger.info(str(e)) #判断进程是否存活 defjudgeIfAlive(ProgramPath,ProcessName): try: printdatetime.now().strftime('%Y-%m-%d%H:%M:%S') forprocessinc.Win32_Process(): ProList.append(str(process.Name)) #把所有任务管理器中的进程名添加到列表 ifProcessNameinProList: countProcessMemoey(ProcessName) #判断进程名是否在列表中,如果是True,则所监控的服务正在运行状态, #打印服务正常运行 print'' printProcessName+"Serverisrunning..." print'' logger.info(ProcessName+"Serverisrunning...") else: #如果进程名不在列表中,即监控的服务挂了,则在log文件下记录日志 #日志文件名是以年月日为文件名 IP=socket.gethostbyname(socket.gethostname()) now=datetime.now().strftime('%Y-%m-%d%H:%M:%S') subject=IP+''+ProcessName+'已停止运行!' logger.info(ProcessName+'已停止运行!') content=now+''+IP+''+ProcessName+'已停止运行!'+'\n请尽快处理!' send_mail(['sunwei_work@163.com','sunweiworkplace@gmail.com'],subject,content) printProcessName+'Serverisnotrunning...' #打印服务状态 logger.info('\n'+'Serverisnotrunning,BeginingtoRestartServer...'+'\n'+(time.strftime('%Y-%m-%d%H:%M:%S--%A--%c',time.localtime())+'\n')) #写入时间和服务状态到日志文件中 os.startfile(ProgramPath) #调用服务重启 logger.info(ProcessName+'RestartServerSuccess...'+'\n'+time.strftime('%Y-%m-%d%H:%M:%S--%A--%c',time.localtime())) printProcessName+'RestartServerSuccess...' printtime.strftime('%Y-%m-%d%H:%M:%S--%A--%c',time.localtime()) delProList[:] #清空列表,否则列表会不停的添加进程名,会占用系统资源 exceptException,e: printstr(e) logger.info(str(e)) defstartMonitor(ProgramPathDict,ProcessNameDict): foriinrange(0,len(ProcessNameDict)): judgeIfAlive(ProgramPathDict[i],ProcessNameDict[i]) if__name__=="__main__": CONFIGFILE='config.ini' config=ConfigParser() config.read(CONFIGFILE) ProgramPathDict=config.get('MonitorProgramPath','ProgramPath').split("|") ProcessNameDict=config.get('MonitorProcessName','ProcessName').split("|") whileTrue: startMonitor(ProgramPathDict,ProcessNameDict) time.sleep(int(config.get('MonitorProcessValue','Time')))
所用配置文件config.ini
[MonitorProgramPath] ProgramPath:C:\Windows\System32\services.exe|C:\ProgramFiles(x86)\Google\Chrome\Application\chrome.exe [MonitorProcessName] ProcessName:services.exe|chrome.exe [MonitorProcessValue] Memory:5000.0 CPU:50.0 Time:60 [Mail] mail_host:smtp.163.com mail_user: mail_pass: mail_postfix:163.com
以上就是本次小编整理的关于Python对Windows服务进行监控的全部代码内容,感谢你对毛票票的支持。