zoukankan      html  css  js  c++  java
  • 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去回收。

    就算不在校园,也要保持饥渴,学到老,活到老嘛 我是一个小QA,我为自己代言!!!!!!!!!!!!!
  • 相关阅读:
    toggle
    Java 运算符
    Java 修饰符
    Java 变量类型
    java对象和类
    java基础笔记
    Java添加事件的几种方式(转载了codebrother的文章)
    mybatis中的#和$的区别?
    为什么java里面经常作List判断的时候,既要判断list不为null,又要判断size>0呢,岂不是多此一举吗?
    发送邮件功能 Service 层
  • 原文地址:https://www.cnblogs.com/xiamuyouren/p/3272841.html
Copyright © 2011-2022 走看看