zoukankan      html  css  js  c++  java
  • python 监控redis的进程与端口

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    import glob,psutil
    import json,os,datetime
    import collections
    
    start_date=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    #指定配置文件位置
    redis_conf='/usr/local/redis/etc/*.conf'
    
    #筛选出匹配的行
    def grep(files,str):
        str_list=dict()
        #获取配置文件
        for file in glob.glob(files):
            r_file=open(file,'r')
            str_list[file]=''
            for i in r_file:
                #判断是否包含指定的字符
                if str in i:
                    str_list[file]={i}
                                         
            r_file.close()
        return str_list
    
    #获取进程的端口号
    def port_pid(pid):
            p = psutil.Process(pid)
            data=p.connections()
            data_listen=[x for x in data if 'LISTEN' in x ]
            pid_port=[]
            for port in data_listen:
                pid_port.append(port.laddr.port)
            return list(set(pid_port))
    
    
    #获取配置文件中的端口与pid文件位置
    ports=grep(redis_conf,'port')
    pids=grep(redis_conf,'pidfile')
    
    #collections.OrderedDict()记住排序
    status=collections.OrderedDict()
    
    #获取pid文件
    for i in pids.keys():
        #获取pid文件
        if len(pids[i]) > 0:
            file_list=list(pids[i])[0].split()[1].replace('
    ','')
        else:
            file_list='/var/run/redis.pid'
            if not os.path.exists(file_list):
                status[i]={'info':"未找到pid文件"}
                status['status']='error'
                continue
            
        #获取配置文件里的端口号
        conf_port=list(ports[i])[0].split()[1].replace('
    ','')
        
        #查看pid
        try:
            f=open(file_list)
        except:
            info="%s无法打开"%file_list
            
            status[i]={'info':info}
            status['status']='error'
            continue
        
        pid=int(f.read())
        #获取进程绑定的端口
        try:
            port=port_pid(pid)
        except:
            info="%s的pid无法查询到相关信息"%file_list
            
            status[i]={'info':info}
            status['status']='error'
            continue
        
        #端口不能为0
        if len(port) > 0:
            #端口号唯一
            if len(port) == 1:
                
                #端口要与配置文件里的一致
                if int(port[0]) == int(conf_port):
                    
                    info='正常'
                    
                    status['status']='ok'
                    status[i]={'info':info,'pid_port':int(port[0]),'pid':pid}
                    
                else:
                    info='绑定的端口与配置文件不一致,配置文件的%s,绑定的 %s'%(int(conf_port),int(port[0]))
                    
                    status['status']='error'
                    status[i]['info']=info
            
            else:
                info='发现绑定了多个LISTEN %s'%port
                
                status['status']='error'
                status[i]['info']=info
                
        else:
            info='未发现绑定LISTEN %s'%conf_port
            
            status['status']='error'
            status[i]['info']=info
    
    #记录启动与结束的时间
    status['start_date']=start_date
    status['end_date']=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    #格式化
    #print json.dumps(status,ensure_ascii=False, indent=2)
    print json.dumps(status,ensure_ascii=False)
  • 相关阅读:
    Android开源框架——Volley
    Android中的事件传递机制
    @ViewDebug.ExportedProperty的使用
    字符间距——扩展
    读取assets文件夹下图片(ods_interview)
    Android消息推送——JPush极光推送
    深入模块
    正则表达式和re模块
    初识模块
    迭代器和生成器
  • 原文地址:https://www.cnblogs.com/cainiaoit/p/8651743.html
Copyright © 2011-2022 走看看