python-监控服务

最近写了一个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去判断的时候,要过滤掉这个。

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

 

posted @ 2013-08-21 15:54  夏木友人  阅读(1192)  评论(0编辑  收藏  举报