代碼講解Python對Windows服務(wù)進行監(jiān)控
更新時間:2018年02月11日 13:41:26 投稿:laozhang
本篇文章給大家分享了通過Python對Windows服務(wù)進行監(jiān)控的實例代碼,對此有興趣的朋友可以學(xué)習(xí)參考下。
我們首先來看下python的全部代碼,大家可以直接復(fù)制后測試:
#-*- 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 # 創(chuàng)建一個logger logger = logging.getLogger('Monitor') logger.setLevel(logging.DEBUG) # 創(chuàng)建一個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服務(wù)器地址,這里是163的smtp地址 mail_user=config.get('Mail','mail_user') #用戶名 mail_pass=config.get('Mail','mail_pass') #密碼 mail_postfix=config.get('Mail','mail_postfix') #郵箱的后綴,網(wǎng)易就是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) #連接服務(wù)器 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 #讀取配置文件中的進程名和系統(tǒng)路徑,這2個參數(shù)都可以在配置文件中修改 ProList = [] #定義一個列表 c = wmi.WMI() #獲取進程所用內(nèi)存 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進程所占內(nèi)存,因此通過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 + '內(nèi)存使用量過高!' content = now + ' ' + IP +' ' + processName + '內(nèi)存使用量過高,達到'+str(totalMem) +'M\n請盡快處理!' logger.info(processName +'內(nèi)存使用量過高,達到'+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)) #把所有任務(wù)管理器中的進程名添加到列表 if ProcessName in ProList: countProcessMemoey(ProcessName) #判斷進程名是否在列表中,如果是True,則所監(jiān)控的服務(wù)正在 運行狀態(tài), #打印服務(wù)正常運行 print '' print ProcessName+" Server is running..." print '' logger.info(ProcessName+" Server is running...") else: #如果進程名不在列表中,即監(jiān)控的服務(wù)掛了,則在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...' #打印服務(wù)狀態(tài) 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')) #寫入時間和服務(wù)狀態(tài)到日志文件中 os.startfile(ProgramPath) #調(diào)用服務(wù)重啟 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[:] #清空列表,否則列表會不停的添加進程名,會占用系統(tǒng)資源 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
以上就是本次小編整理的關(guān)于Python對Windows服務(wù)進行監(jiān)控的全部代碼內(nèi)容,感謝你對腳本之家的支持。
相關(guān)文章
Python實現(xiàn)快速替換Word文檔中的關(guān)鍵字
使用Python自動化處理Word文檔可以幫助您提高效率,并減少手動處理文檔所需的時間和精力,所以本文為大家準備了Python快速替換Word文檔中的關(guān)鍵字的方法,希望對大家有所幫助2023-06-06Python利用openpyxl類實現(xiàn)在Excel中繪制樂高圖案
在商場看到一個超級瑪麗的樂高圖,感覺使用excel的顏色填充也能畫出來。所以本文將借助openpyxl類實現(xiàn)在Excel中繪制樂高圖案,需要的可以參考一下2022-12-12Python使用urllib模塊的urlopen超時問題解決方法
這篇文章主要介紹了Python使用urllib模塊的urlopen超時問題解決方法,本文使用socket模塊中的setdefaulttimeout函數(shù)解決了超時問題,需要的朋友可以參考下2014-11-11Python學(xué)習(xí)筆記_數(shù)據(jù)排序方法
Python對數(shù)據(jù)排序有兩種方法:下面我們來簡單分析下2014-05-05tensorflow將圖片保存為tfrecord和tfrecord的讀取方式
今天小編就為大家分享一篇tensorflow將圖片保存為tfrecord和tfrecord的讀取方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02