#!/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)