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

我们首先来看下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实现windows下的抓包与解析
  • Python编写Windows Service服务程序
  • wxPython的安装图文教程(Windows)
  • windows 下python+numpy安装实用教程
  • windows下python之mysqldb模块安装方法
  • python WindowsError的错误代码详解
  • 安装Python的教程-Windows
  • windows下Python实现将pdf文件转化为png格式图片的方法
  • 利用Python实现Windows下的鼠标键盘模拟的实例代码
  • python脚本作为Windows服务启动代码详解
(0)

相关推荐

  • 使用Python实现windows下的抓包与解析

    系统环境:windows7,选择windows系统是因为我对自己平时日常机器上的流量比较感兴趣 python环境:python2.7 ,这里不选择python3的原因,是因为接下来要用到的scapy包在python3中安装较于python2要麻烦得多.如果你习惯于用python3,数据包的分析完全可以放在3下面做,因为抓包和分析是两个完全独立的过程. 需要的python包:scapy和dpkt 抓包代码: from scapy.sendrecv import sniff from scapy.u

  • windows下Python实现将pdf文件转化为png格式图片的方法

    本文实例讲述了windows下Python实现将pdf文件转化为png格式图片的方法.分享给大家供大家参考,具体如下: 最近工作中需要把pdf文件转化为图片,想用Python来实现,于是在网上找啊找啊找啊找,找了半天,倒是找到一些代码. 1.第一个找到的代码,我试了一下好像是反了,只能实现把图片转为pdf,而不能把pdf转为图片... 参考链接:https://zhidao.baidu.com/question/745221795058982452.html 代码如下: #!/usr/bin/e

  • windows 下python+numpy安装实用教程

    如题,今天兜兜转转找了很多网站帖子,一个个环节击破,最后装好费了不少时间. 希望这个帖子能帮助有需要的人,教你一篇帖子搞定python+numpy,节约科研时间. 水平有限,难免存在不足,敬请指正. *******************python安装**************************************************** step1:官网下载安装包: https://www.python.org/ 我下载的是python-3.4.4.msi step2:pyt

  • Python编写Windows Service服务程序

    如果你想用Python开发Windows程序,并让其开机启动等,就必须写成windows的服务程序Windows Service,用Python来做这个事情必须要借助第三方模块pywin32,自己去下载然后安装(注意下载符合自己OS的版本). 1.示例分析 1).幸运的是这里有一个简单的服务模版,足以满足大多数人的要求: #encoding=utf-8 #ZPF import win32serviceutil import win32service import win32event class

  • python WindowsError的错误代码详解

    WindowsError的错误代码详解 0操作成功完成. 1功能错误. 2系统找不到指定的文件. 3系统找不到指定的路径. 4系统无法打开文件. 5拒绝访问. 6句柄无效. 7存储控制块被损坏. 8存储空间不足,无法处理此命令. 9存储控制块地址无效. 10环境错误. 11试图加载格式错误的程序. 12访问码无效. 13数据无效. 14存储器不足,无法完成此操作. 15系统找不到指定的驱动器. 16无法删除目录. 17系统无法将文件移到不同的驱动器. 18没有更多文件. 19介质受写入保护. 2

  • wxPython的安装图文教程(Windows)

    一.wxPython介绍 1.wxPython是Python语言的一套优秀的GUI图形库.wxPython可以很方便的创建完整的.功能键全的GUI用户界面. wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户的. 2.wxPython是跨平台的,可以在不修改程序的情况下在多种平台上运行.目前支持的平台有Win32/Win64.Mac OS X及大多数的Unix系统. 二.下载地址 https://www.wxpython.org/pa

  • 利用Python实现Windows下的鼠标键盘模拟的实例代码

    本文介绍了利用Python实现Windows下的鼠标键盘模拟的实例代码,分享给大家 本来用按键精灵是可以实现我的需求,而且更简单,但既然学python ,就看一下呗. 依赖: PyUserInput pip install PyUserInput PyUserInput 依赖 pyhook,所以还得安装 pyhook.按需下载,下载地址. 我是 win10 64 位 python 2.7,用的是第二个,下载之后用解压软件打开,把 pyHook放到C:\Python27\Lib\site-pack

  • 安装Python的教程-Windows

    在开始Python编程前,需要先安装Python环境.Python安装包可以到Python的官网下载,官网地址是https://www.python.org/,如果想直接跳过关于Python的介绍相关直接下载安装包,则可以直接访问https://www.python.org/downloads/下载安装包即可. Windows下安装Python 要在Windows下安装Python,请按照下面的步骤进行: 1.打开Web浏览器,访问https://www.python.org/downloads

  • python脚本作为Windows服务启动代码详解

    我们首先来看下全部代码: # -*- coding: cp936 -*- import win32serviceutil import win32service import win32event class test1(win32serviceutil.ServiceFramework): _svc_name_ = "test_python" _svc_display_name_ = "test_python" def __init__(self, args):

  • windows下python之mysqldb模块安装方法

    之所以会写下这篇日志,是因为安装的过程有点虐心.目前这篇文章是针对windows操作系统上的mysqldb的安装.安装python的mysqldb模块,首先当然是找一些官方的网站去下载:https://pypi.python.org/pypi/MySQL-python.下载后,cmd进入MySQL-python-1.2.3文件夹,按常规的执行python setup.py install 命令安装此模块,然后就报错了: 这个报错很明显,print 进行python前,应该先确定当前mysqldb

随机推荐