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


Posted in Python onFebruary 11, 2018

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

#-*- encoding: utf-8 -*-  
import logging  
import wmi  
import os  
import time  
from ConfigParser import ConfigParser  
import smtplib  
from email.mime.text import MIMEText  
import socket 
from datetime import datetime 
import re 
import sys 
import time 
import string 
import psutil  
import threading 
from threading import Timer   
import logging 
# 创建一个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')  
 
def send_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()  
    return True  
  except Exception, e:  
    print str(e) 
    logger.info(str(e))    
    return False  
 
 
 #读取配置文件中的进程名和系统路径,这2个参数都可以在配置文件中修改 
ProList = []  
#定义一个列表 
c = wmi.WMI()  
 
#获取进程所用内存 
def countProcessMemoey(processName): 
  try: 
    CONFIGFILE = 'config.ini'  
    config = ConfigParser()  
    config.read(CONFIGFILE)  
 
    pattern = re.compile(r'([^\s]+)\s+(\d+)\s.*\s([^\s]+\sK)') 
    cmd = 'tasklist /fi "imagename eq ' + processName + '"' + ' | findstr.exe ' + processName 
    result = os.popen(cmd).read() 
    resultList = result.split("\n") 
    totalMem = 0.0 
    totalCpu = 0.0 
 
    print "*" * 80 
    for srcLine in resultList: 
      srcLine = "".join(srcLine.split('\n')) 
      if len(srcLine) == 0: 
        break 
      m = pattern.search(srcLine) 
      if m == None: 
        continue 
      #由于是查看python进程所占内存,因此通过pid将本程序过滤掉 
      if str(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) + '\tmemory size:%.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 
      
    if totalMem> float(config.get('MonitorProcessValue','Memory')): 
      print 'Memory Exceed!' 
      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) 
    if totalCpu > float(config.get('MonitorProcessValue','CPU')): 
      print 'CPU Exceed!' 
      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) 
  except Exception, e:  
    print str(e) 
    logger.info(str(e))   
  
#判断进程是否存活 
def judgeIfAlive(ProgramPath,ProcessName): 
  try: 
    print datetime.now().strftime('%Y-%m-%d %H:%M:%S') 
    for process in c.Win32_Process():  
      ProList.append(str(process.Name))  
    #把所有任务管理器中的进程名添加到列表 
 
    if ProcessName in ProList: 
      countProcessMemoey(ProcessName)  
    #判断进程名是否在列表中,如果是True,则所监控的服务正在 运行状态, 
    #打印服务正常运行 
      print ''  
      print ProcessName+" Server is running..."  
      print ''  
      logger.info(ProcessName+" Server is running...") 
    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) 
      print ProcessName+' Server is not running...'  
      #打印服务状态 
      logger.info('\n'+'Server is not running,Begining to Restart Server...'+'\n'+(time.strftime('%Y-%m-%d %H:%M:%S --%A--%c', time.localtime()) +'\n')) 
      #写入时间和服务状态到日志文件中 
      os.startfile(ProgramPath)  
      #调用服务重启 
      logger.info(ProcessName+'Restart Server Success...'+'\n'+time.strftime('%Y-%m-%d %H:%M:%S --%A--%c', time.localtime())) 
      print ProcessName+'Restart Server Success...'  
      print time.strftime('%Y-%m-%d %H:%M:%S --%A--%c', time.localtime())  
    del ProList[:]  
    #清空列表,否则列表会不停的添加进程名,会占用系统资源 
  except Exception, e:  
    print str(e) 
    logger.info(str(e))   
def startMonitor(ProgramPathDict,ProcessNameDict) :  
  for i in range(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("|") 
  while True:  
    startMonitor(ProgramPathDict,ProcessNameDict)  
    time.sleep(int(config.get('MonitorProcessValue','Time')))

所用配置文件config.ini

[MonitorProgramPath]  
ProgramPath: C:\Windows\System32\services.exe|C:\Program Files (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服务进行监控的全部代码内容,感谢你对三水点靠木的支持。

Python 相关文章推荐
linux 下实现python多版本安装实践
Nov 18 Python
python连接远程ftp服务器并列出目录下文件的方法
Apr 01 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
May 25 Python
理解Python中的With语句
Mar 18 Python
Python实现的读取文件内容并写入其他文件操作示例
Apr 09 Python
PyQt5 在label显示的图片中绘制矩形的方法
Jun 17 Python
简单了解python PEP的一些知识
Jul 13 Python
python 爬取古诗文存入mysql数据库的方法
Jan 08 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
Feb 28 Python
python将音频进行变速的操作方法
Apr 08 Python
tensorflow中tf.reduce_mean函数的使用
Apr 19 Python
Python文件操作模拟用户登陆代码实例
Jun 09 Python
django 按时间范围查询数据库实例代码
Feb 11 #Python
python实现媒体播放器功能
Feb 11 #Python
python使用pycharm环境调用opencv库
Feb 11 #Python
Python元组及文件核心对象类型详解
Feb 11 #Python
详解Python核心对象类型字符串
Feb 11 #Python
python使用json序列化datetime类型实例解析
Feb 11 #Python
Python中pow()和math.pow()函数用法示例
Feb 11 #Python
You might like
php getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
PHP进程通信基础之信号
2017/02/19 PHP
PHP命名空间简单用法示例
2018/12/28 PHP
JQuery SELECT单选模拟jQuery.select.js
2009/11/12 Javascript
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
基于JS实现省市联动效果代码分享
2016/06/06 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
使用Node搭建reactSSR服务端渲染架构
2018/08/30 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
Python中的startswith和endswith函数使用实例
2014/08/25 Python
python中MySQLdb模块用法实例
2014/11/10 Python
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
django 发送手机验证码的示例代码
2018/04/25 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
python飞机大战pygame游戏之敌机出场实现方法详解
2019/12/17 Python
Python字典底层实现原理详解
2019/12/18 Python
jupyternotebook 撤销删除的操作方式
2020/04/17 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
python 调用Google翻译接口的方法
2020/12/09 Python
浅析python实现动态规划背包问题
2020/12/31 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
德国机场停车位比较和预订网站:Ich-parke-billiger
2018/01/08 全球购物
红色连衣裙精品店:Red Dress Boutique
2018/08/11 全球购物
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
大学军训感言400字
2014/03/11 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
家长学校教学计划
2015/01/19 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
Mysql中mvcc各场景理解应用
2022/08/05 MySQL