代码讲解Python对Windows服务进行监控
我们首先来看下python的全部代码,大家可以直接复制后测试:
#-*-encoding:utf-8-*-
importlogging
importwmi
importos
importtime
fromConfigParserimportConfigParser
importsmtplib
fromemail.mime.textimportMIMEText
importsocket
fromdatetimeimportdatetime
importre
importsys
importtime
importstring
importpsutil
importthreading
fromthreadingimportTimer
importlogging
#创建一个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')
defsend_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()
returnTrue
exceptException,e:
printstr(e)
logger.info(str(e))
returnFalse
#读取配置文件中的进程名和系统路径,这2个参数都可以在配置文件中修改
ProList=[]
#定义一个列表
c=wmi.WMI()
#获取进程所用内存
defcountProcessMemoey(processName):
try:
CONFIGFILE='config.ini'
config=ConfigParser()
config.read(CONFIGFILE)
pattern=re.compile(r'([^\s]+)\s+(\d+)\s.*\s([^\s]+\sK)')
cmd='tasklist/fi"imagenameeq'+processName+'"'+'|findstr.exe'+processName
result=os.popen(cmd).read()
resultList=result.split("\n")
totalMem=0.0
totalCpu=0.0
print"*"*80
forsrcLineinresultList:
srcLine="".join(srcLine.split('\n'))
iflen(srcLine)==0:
break
m=pattern.search(srcLine)
ifm==None:
continue
#由于是查看python进程所占内存,因此通过pid将本程序过滤掉
ifstr(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)+'\tmemorysize:%.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
iftotalMem>float(config.get('MonitorProcessValue','Memory')):
print'MemoryExceed!'
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)
iftotalCpu>float(config.get('MonitorProcessValue','CPU')):
print'CPUExceed!'
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)
exceptException,e:
printstr(e)
logger.info(str(e))
#判断进程是否存活
defjudgeIfAlive(ProgramPath,ProcessName):
try:
printdatetime.now().strftime('%Y-%m-%d%H:%M:%S')
forprocessinc.Win32_Process():
ProList.append(str(process.Name))
#把所有任务管理器中的进程名添加到列表
ifProcessNameinProList:
countProcessMemoey(ProcessName)
#判断进程名是否在列表中,如果是True,则所监控的服务正在运行状态,
#打印服务正常运行
print''
printProcessName+"Serverisrunning..."
print''
logger.info(ProcessName+"Serverisrunning...")
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)
printProcessName+'Serverisnotrunning...'
#打印服务状态
logger.info('\n'+'Serverisnotrunning,BeginingtoRestartServer...'+'\n'+(time.strftime('%Y-%m-%d%H:%M:%S--%A--%c',time.localtime())+'\n'))
#写入时间和服务状态到日志文件中
os.startfile(ProgramPath)
#调用服务重启
logger.info(ProcessName+'RestartServerSuccess...'+'\n'+time.strftime('%Y-%m-%d%H:%M:%S--%A--%c',time.localtime()))
printProcessName+'RestartServerSuccess...'
printtime.strftime('%Y-%m-%d%H:%M:%S--%A--%c',time.localtime())
delProList[:]
#清空列表,否则列表会不停的添加进程名,会占用系统资源
exceptException,e:
printstr(e)
logger.info(str(e))
defstartMonitor(ProgramPathDict,ProcessNameDict):
foriinrange(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("|")
whileTrue:
startMonitor(ProgramPathDict,ProcessNameDict)
time.sleep(int(config.get('MonitorProcessValue','Time')))
所用配置文件config.ini
[MonitorProgramPath] ProgramPath:C:\Windows\System32\services.exe|C:\ProgramFiles(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服务进行监控的全部代码内容,感谢你对毛票票的支持。