最近写了一个web测试程序,因为部署在其他地方,所以想弄个监控的进程去看服务是不是还在,要是不在好发邮件,就用python简单的写了一个。
想法是这样的,单独运行一个monitor的脚本,每隔一段时间去访问web服务,如果无法链接,就说明服务挂了,要发邮件通知下,如果恢复了,那就发邮件提醒已经恢复。
当然,有的时候也要考虑到监控进程本身就挂了,或者不想监控了。
首先监控脚本是这样,很简单:
monitor.py
#-*-coding ''' 简单的monitor函数,主要监控一个远程服务是否还在 system 是一个系统model ''' import time import sys def monitor(system): last_monitor_status=True TimeInterval=10 while True: is_active=check_system_status(system.env.env_ip,system.env.env_port,\ system.env.get_env_path()) if is_active==False and last_monitor_status==True: ''' system is down,do something ''' pass elif is_active==True and last_monitor_status==False: ''' system revover ''' pass else: pass last_monitor_status=is_active time.sleep(TimeInterval) if __name__=="__main__": system=sys.argv[1] monitor(system)
然后是监控的一些操作
control.py
#-*-coding:utf-8 import subprocess import os def startMonitor(system): ''' 通过subprocess去启动监控 ''' monitorprocess=subprocess.Popen(["python","monitor.py","{0}".format(system)],\ shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE) output,error=monitorprocess.communicate(input=None) if error: raise RuntimeError,error pid=monitorprocess.pid return True def stopMonitor(pid): kill_result={0:"success",256:"no such process"} kill_status=os.system("kill -9 {0}".format(pid)) return kill_result[kill_status] def checkMonitorProcess(pid): systemcmd="ps -ef|grep -v '<defunct>'|awk '{print $2}'|grep {0}".\ format(pid) monitorstatus=os.system(systemcmd) return monitorstatus
用的话还是可以用的,服务发生异常都会发送邮件,在实际运行中遇到过这样的问题
1.通过subprocess去启动monitor脚本的时候,本来想通过comunicate()方法获取output和error,如果启动失败,抛出异常,确实当error有值的时候,会抛出异常,但是当
error没有的时候,本来应该正常启动监控,但是实际上通过浏览器启动的时候,本来启动成功了,浏览器也加载完成,但是浏览器的http请求好像一直连着,当去掉communicate()方法后
又可以立即启动,并且浏览器http加载完成,这个问题很苦恼,难道是因为我monitor脚本是一直循环运行的原因吗?但是我monitor是单独启动一个进程去执行的,应该没什么关系么
2.就是当我中止监控进程,想要检查进程还在的时候,因为我是用kill -9 pid去杀进程,然后判断进程号是不是还在,但是实际上当你立刻杀死进程的时候,还会有一个<defunct>的死进程在,要过会才会被回收,所以通过grep去判断的时候,要过滤掉这个。