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('\n','')
    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('\n','')
    
    #查看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)

 

posted @ 2018-03-26 16:13  IT菜鸟园  阅读(1253)  评论(0编辑  收藏  举报