代码讲解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 相关文章推荐
python正则表达式re模块详解
Jun 25 Python
Python脚本实时处理log文件的方法
Nov 21 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
对Python3中的print函数以及与python2的对比分析
May 02 Python
详解python3中tkinter知识点
Jun 21 Python
python 字典中取值的两种方法小结
Aug 02 Python
查看端口并杀进程python脚本代码
Dec 17 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
Mar 02 Python
keras得到每层的系数方式
Jun 15 Python
使用Python项目生成所有依赖包的清单方式
Jul 13 Python
python实现图片转换成素描和漫画格式
Aug 19 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
PHP如何将log信息写入服务器中的log文件
2015/07/29 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
2017/07/03 PHP
PHP中的自动加载操作实现方法详解
2019/08/06 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
js 实现菜单上下显示附效果图
2013/11/21 Javascript
JS实现FLASH幻灯片图片切换效果的方法
2015/03/04 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
Python3批量生成带logo的二维码方法
2019/06/24 Python
简单了解python gevent 协程使用及作用
2019/07/22 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
Python3常用内置方法代码实例
2019/11/18 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
纽约香氛品牌:NEST Fragrance
2018/10/15 全球购物
计算机大学生的自我评价
2013/10/15 职场文书
房地产销售员的自我评价分享
2013/12/04 职场文书
关于保护环境的标语
2014/06/09 职场文书
军训拉歌口号
2014/06/13 职场文书
2015年三万活动总结
2015/03/25 职场文书
2015年电气技术员工作总结
2015/07/24 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
怎样写工作总结啊!
2019/06/18 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书
golang json数组拼接的实例
2021/04/28 Golang
React配置子路由的实现
2021/06/03 Javascript