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

python 监控redis的进程与端口的更多相关文章

  1. 监控redis进程,如果没有自动重启

    监控redis进程,如果没有自动重启 #Time:2016-01-22#Version:1.0 #Author:chh-huang #设置环境变量source /etc/profile#source ...

  2. python监控端口脚本[jkport2.0.py]

    #!/usr/bin/env python #!coding=utf-8 import os import time import sys import smtplib from email.mime ...

  3. 原来zabbix监控进程与端口是如此的简单!

    使用zabbix自带key监控进程与端口 每个公司都有自己的程序,自己的进程名与端口监听,对于nagios来说,这些都经常需要自己去写插件,但是zabbix不需要,它自己就有监控进程与端口的key. ...

  4. 监控redis数据库应用状态:python,tornado实现

    公司里最近redis服务器压力越来越大,其大概情况,只能从操作系统层面看,并不详尽,故同事在网上找了一个叫做 redis-live的开源项目,我配合部署了一下,还真有点意思,并解决了其中部分小debu ...

  5. python os.startfile python实现双击运行程序 python监控windows程序 监控进程不在时重新启动

    用python监控您的window服务 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://world77.blog.51cto.co ...

  6. 使用Zabbix官方模板监控Redis运行状况

    运行环境: OS:CentOS 6.8 / Python: 2.6.6 / Pip: 7.1.0 / Redis:3.0 / Zabbix:3.0.3 Zabbix官方提供的监控模板. 项目地址:ht ...

  7. python之redis和memcache操作

    Redis 教程 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据 ...

  8. python——操作Redis

    在使用django的websocket的时候,发现web请求和其他当前的django进程的内存是不共享的,猜测django的机制可能是每来一个web请求,就开启一个进程去与web进行交互,一次来达到利 ...

  9. Python操作Redis、Memcache、RabbitMQ、SQLAlchemy

    Python操作 Redis.Memcache.RabbitMQ.SQLAlchemy redis介绍:redis是一个开源的,先进的KEY-VALUE存储,它通常被称为数据结构服务器,因为键可以包含 ...

随机推荐

  1. android问题笔记集

    开发工具:android studio2.2 调试:手机直连调试,版本(android6) 问题1: Error:Unable to start the daemon process. This pr ...

  2. DataView RowFilter Syntax [C#]

    RowFilter语法 private void btnEnquiry_Click(object sender, EventArgs e) { string filterExpression = st ...

  3. 算法(3)Rotate Array

    题目:将一个n个元素的数组右移k位,比如n=7,k=3,对数组[1,2,3,4,5,6,7]作如下旋转[5,6,7,1,2,3,4] 思路:[5,6,7,1,2,3,4],不知大家看出来了没有呢,两次 ...

  4. JAVA调用Oracle存储过程和函数

    连接数据库的工具类: import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; imp ...

  5. 【AtCoder ARC076】F Exhausted? 霍尔定理+线段树

    题意 N个人抢M个椅子,M个椅子排成一排 ,第i个人只能坐[1,Li]∪[Ri,M],问最多能坐多少人 $i$人连边向可以坐的椅子构成二分图,题意即是求二分图最大完美匹配,由霍尔定理,答案为$max( ...

  6. 在.net2.0下使用System.Web.Script.Serialization;

    最近,在弄json字符串转为对象.需要添加这个引用System.Web.Script.Serialization;因为版本必须是dotnet2.0的原因,发现很多解决方案不适合自己.故使用这种解决办法 ...

  7. Antlr 在 idea 中正确使用的方式

    问题 Caused by: java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN ...

  8. 02.Java面向对象问题

    目录介绍 2.0.0.1 重载和重写的区别?重载和重写绑定机制有何区别?父类的静态方法能否被子类重写? 2.0.0.2 封装.继承.多态分别是什么? 2.0.0.3 接口和抽象类的区别是什么?接口的意 ...

  9. 洛谷 P2218 [HAOI2007]覆盖问题 解题报告

    P2218 [HAOI2007]覆盖问题 题目描述 某人在山上种了\(N\)棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他 ...

  10. 用DOM解析XML ,用xpath快速查询XML节点

    XPath是一种快速查询xml节点和属性的一种语言,Xpath和xml的关系就像是sql语句和数据库的关系.用sql语句可以从数据库中快速查询出东西同样的用xPath也可以快速的从xml中查询出东西. ...