python监控_python-监控服务

最近写了一个web测试程序,因为部署在其他地方,所以想弄个监控的进程去看服务是不是还在,要是不在好发邮件,就用python简单的写了一个。

想法是这样的,单独运行一个monitor的脚本,每隔一段时间去访问web服务,如果无法链接,就说明服务挂了,要发邮件通知下,如果恢复了,那就发邮件提醒已经恢复。

当然,有的时候也要考虑到监控进程本身就挂了,或者不想监控了。

首先监控脚本是这样,很简单:

monitor.py

#-*-coding

'''简单的monitor函数,主要监控一个远程服务是否还在

system 是一个系统model'''

importtimeimportsysdefmonitor(system):

last_monitor_status=True

TimeInterval=10

whileTrue:

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:passlast_monitor_status=is_active

time.sleep(TimeInterval)if __name__=="__main__":

system=sys.argv[1]

monitor(system)

然后是监控的一些操作

control.py

#-*-coding:utf-8

importsubprocessimportosdefstartMonitor(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)iferror:raiseRuntimeError,error

pid=monitorprocess.pidreturnTruedefstopMonitor(pid):

kill_result={0:"success",256:"no such process"}

kill_status=os.system("kill -9 {0}".format(pid))returnkill_result[kill_status]defcheckMonitorProcess(pid):

systemcmd="ps -ef|grep -v ''|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去杀进程,然后判断进程号是不是还在,但是实际上当你立刻杀死进程的时候,还会有一个的死进程在,要过会才会被回收,所以通过grep去判断的时候,要过滤掉这个。

ps:我猜这个进程应该是类似孤儿进程之类的吧,父进程被杀了,变孤儿了,然后过会由init回收了。僵尸进程好像是子进程完成任务了,然后发送消息给父进程,但是父进程没搭理,本来父进程退出以后,子进程也就退出了,但是偏偏父进程是一个一直运行的进程,就导致了子进程没事做,但又没被回收,就变成了僵尸进程,可以看出僵尸进程不干活了,但是过多的话还是会占用资源,想要避免僵尸进程的一个办法就是把僵尸变成孤儿,要init去回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值