代码讲解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中使用lambda高效操作列表的教程
Apr 24 Python
python MySQLdb Windows下安装教程及问题解决方法
May 09 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
Dec 31 Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
python 产生token及token验证的方法
Dec 26 Python
python常用排序算法的实现代码
Nov 08 Python
Pytorch之finetune使用详解
Jan 18 Python
python网络编程:socketserver的基本使用方法实例分析
Apr 09 Python
Django实现celery定时任务过程解析
Apr 21 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 Python
Python在线和离线安装第三方库的方法
Oct 31 Python
python实现PolynomialFeatures多项式的方法
Jan 06 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的ZipArchive类用法实例
2014/10/20 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
Javascript中3个需要注意的运算符
2015/04/02 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
解决webpack无法通过IP地址访问localhost的问题
2018/02/22 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
2018/05/16 Javascript
详解ES6中的三种异步解决方案
2018/06/28 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
浅谈python爬虫使用Selenium模拟浏览器行为
2018/02/23 Python
使用python脚本实现查询火车票工具
2018/07/19 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
详解Python Qt的窗体开发的基本操作
2019/07/14 Python
Python绘制股票移动均线的实例
2019/08/24 Python
Python 日期的转换及计算的具体使用详解
2020/01/16 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
Urban Outfitters美国官网:美国生活方式品牌
2016/08/26 全球购物
通信工程毕业生求职信
2013/11/16 职场文书
家长给老师的道歉信
2014/01/13 职场文书
文明演讲稿范文
2014/05/12 职场文书
现场活动策划方案
2014/08/22 职场文书
个人融资协议书
2014/10/02 职场文书
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL
mysql使用 not int 子查询隐含陷阱
2022/04/12 MySQL
Python创建SQL数据库流程逐步讲解
2022/09/23 Python