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