代码讲解Python对Windows服务进行监控

  

我们首先来看下python的全部代码,大家可以直接复制后测试:

        # - * -编码:utf - 8 - *   导入日志   进口wmi   进口操作系统   导入的时间   从ConfigParser进口ConfigParser   进口smtplib   从email.mime。文本导入MIMEText   进口套接字   从datetime进口datetime   进口再保险   导入系统   导入的时间   进口的字符串   进口psutil   进口线程   从线程进口计时器   导入日志   #创建一个记录器   记录器=logging.getLogger(监控)   logger.setLevel (logging.DEBUG)      #创建一个处理程序,用于写入日志文件   跳频=logging.FileHandler (“test.log”)   fh.setLevel (logging.DEBUG)      格式化程序=logging.Formatter (“% (asctime) s - %(名字)s - % (levelname) s - %(消息)s ')   fh.setFormatter (formatter)   logger.addHandler(跳频)      重载(sys) # Python2.5初始化后会删除系统。setdefaultencoding这个方法,我们需要重新载入   sys.setdefaultencoding (“utf - 8”)      def send_mail (to_list、子、内容):   CONFIGFILE=' config.ini '   配置=ConfigParser ()   config.read (CONFIGFILE)   mail_host=config.get(“邮件”,“mail_host”) #使用的邮箱的smtp服务器地址,这里是163年的smtp地址   mail_user=config.get(“邮件”,“mail_user”) #用户名   mail_pass=config.get(“邮件”,“mail_pass”) #密码   mail_postfix=config.get(“邮件”,“mail_postfix”) #邮箱的后缀,网易就是163. com   我=子+ & lt;“+ mail_user +“@”+ mail_postfix +“在”   味精=MIMEText(内容、_subtype=捌皆盻charset=皍tf - 8”)   味精(“主题”)=子   味精['从']=我   味精(',']=";" . join (to_list) #将收件人列表以“;”分隔   试一试:   服务器=smtplib.SMTP ()   server.connect (mail_host) #连接服务器   server.login (mail_user mail_pass) #登录操作   服务器。sendmail(我,to_list msg.as_string ())   server.close ()   还真   除了例外,e:   打印str (e)   logger.info (str (e))   返回假         #读取配置文件中的进程名和系统路径,这2个参数都可以在配置文件中修改   ProList=[]   #定义一个列的表   c=wmi.WMI ()      #获取进程所用内存   def countProcessMemoey (processName):   试一试:   CONFIGFILE=' config.ini '   配置=ConfigParser ()   config.read (CONFIGFILE)      模式=re.compile (r”([^ \ s] +) (\ d +) \ \ s + s。* \ s (s [^ \] + \ sK)”)   cmd=' tasklist/fi”imagename eq + processName +”“+”|中。exe ' + processName   结果=os.popen (cmd) .read ()   resultList=result.split (“\ n”)   totalMem=0.0   totalCpu=0.0      打印“*”* 80   在resultList srcLine:   . join (srcLine.split srcLine=" " (' \ n '))   如果len (srcLine)==0:   打破   m=pattern.search (srcLine)   如果m==没有:   继续   #由于是查看python进程所占内存,因此通过pid将本程序过滤掉   如果str (os.getpid ())==m.group (2):   继续   p=psutil.Process (int (m.group (2)))   cpu=p.cpu_percent(间隔=1)   ori_mem=m.group (3) .replace (”、“,”)   ori_mem=ori_mem。替换(‘K’,”)   ori_mem=ori_mem.replace (r \ sK,”)   memEach=string.atoi (ori_mem)   totalMem +=(memEach * 1.0/1024)   totalCpu +=cpu   打印“ProcessName: ' + m.group (1) + ' \ tPID: ' + m.group (2) + ' \ tmemory大小:%。2 f ' % (memEach * 1.0/1024),“M”+“CPU:”+ str (CPU) +“%”   打印“ProcessName: ' + m.group (1) +“TotalMemory:”+ str (totalMem) +“M”+“totalCPU:”+ str (totalCPU) + ' % '   logger.info (' ProcessName: ' + m.group (1) +“TotalMemory:”+ str (totalMem) +“M”+“totalCPU:”+ str (totalCPU) + ' % ')   打印“*”* 80      如果totalMem>浮动(config.get (' MonitorProcessValue ', '记忆')):   打印“内存超过!”   IP=socket.gethostbyname (socket.gethostname ())   现在=datetime.now ()。strftime (“% Y - % m - H % d %: % m: % S ')   主题=IP + ' ' + processName + '内存使用量过高!”   内容=现在+‘+ IP +‘+ processName +”内存使用量过高,达到“+ str (totalMem) + ' M \ n请尽快处理!”   logger.info (processName +”内存使用量过高,达到“+ str (totalMem) +“M”)   send_mail (“sunwei_work@163.com”、“sunweiworkplace@gmail.com”,主题,内容)   如果totalCpu比;浮动(config.get (MonitorProcessValue, CPU)):   打印“CPU超过!”   IP=socket.gethostbyname (socket.gethostname ())   现在=datetime.now ()。strftime (“% Y - % m - H % d %: % m: % S ')   主题=IP + ' ' + processName + ' CPU使用率过高!”   内容=现在+‘+ IP +‘+ processName +的CPU使用率过高,达到“+ str (totalCpu) + ' % \ n请尽快处理!”   logger.info (processName +的CPU使用率过高,达到“+ str (totalMem) +“M”)   send_mail (“sunwei_work@163.com”、“sunweiworkplace@gmail.com”,主题,内容)   除了例外,e:   打印str (e)   logger.info (str (e))      #判断进程是否存活   def judgeIfAlive (ProgramPath ProcessName):   试一试:   打印datetime.now ()。strftime (“% Y - % m - H % d %: % m: % S ')   在c.Win32_Process过程():   ProList.append (str (process.Name))   #把所有任务管理器中的进程名添加到列的表      如果ProcessName ProList:   countProcessMemoey (ProcessName)   #判断进程名是否在列表中,如果是正确的,则所监控的服务正在运行状态,   #打印服务正常运行   打印”   打印ProcessName +”服务器正在运行……”   打印”   logger.info (ProcessName +“服务器正在运行…”)   其他:   #如果进程名不在列表中,即监控的服务挂了,则在日志文件下记录日志   #日志文件名是以年月日为文件名   IP=socket.gethostbyname (socket.gethostname ())   现在=datetime.now ()。strftime (“% Y - % m - H % d %: % m: % S ')   主题=IP + ' ' + ProcessName + '已停止运行!”   logger.info (ProcessName +”已停止运行!”)   内容=现在+‘+ IP +‘+ ProcessName +”已停止运行!”+“\ n请尽快处理!”   send_mail (“sunwei_work@163.com”、“sunweiworkplace@gmail.com”,主题,内容)   打印ProcessName +“服务器没有运行…”   #打印服务状态   logger.info (' \ n ' + '服务器没有运行,开始重新启动服务器…”+“\ n”+(时间。strftime (“% Y - % m - H % d %: % m: % S - % - % c”, time.localtime ()) + ' \ n '))   #写入时间和服务状态到日志文件中   os.startfile (ProgramPath)   #调用服务重启   logger.info (ProcessName +“重新启动服务器成功…”+“\ n”+时间。strftime (“% Y - % m - H % d %: % m: % S - % - % c”, time.localtime ()))   打印ProcessName +“重新启动服务器成功…”   打印时间。null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

代码讲解Python对Windows服务进行监控