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)