#!/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. 树莓派初次使用的基本配置.md

    记录了一下树莓派初次使用的配置过程,包括装系统.修改 IP 等等. 树莓派(英语:Raspberry Pi),是一款基于 Linux 的单板机电脑. 它由英国的树莓派基金会所开发,目的是以低价硬件及自 ...

  2. linux备忘录-程序管理与SELinux

    知识点 程序与程序(Process and Program) 通过执行一条指令或程序,则可以触发一个事件,并获得一个PID.当我们需要启动一个程序时,我们是启动一个二进制文件(binary file) ...

  3. POJ 2135 Farm Tour(最小费用最大流)

    Description When FJ's friends visit him on the farm, he likes to show them around. His farm comprise ...

  4. [整理]docker内部时区修改的两种方法

    方法一 终端执行 date命令,查看宿主服务器的时区是否正确 如果正确: 执行 docker cp /etc/localtime 容器ID:/etc/localtime 将本地时间拷贝到docker内 ...

  5. ios UI自动化测试学习笔记

    一.一些注意事项: 1.做自动化测试时注意如果是真机话首先要设置不锁屏. 2.自动化测试过程中如果程序后台或崩溃了.脚本运行将会暂停,直到程序再次回到前台. 3.必须明确指定关闭自动测试,测试完成或中 ...

  6. linux基本操作1

    ctrl + alt + T 打开命令行 -根目录下home中为用户建的文件夹 cd 加目录名称转到当前目录 .当前目录..上级目录 ls 当前目录下的文件ls -l 显示当前目录下文件的权限 mkd ...

  7. 基于SDN的IP RAN网络虚拟化技术

    http://www.zte.com.cn/cndata/magazine/zte_technologies/2014/2014_4/magazine/201404/t20140421_422858. ...

  8. php获取微信token和ticket并返回签名

    jssdk.php页,主要获取token和ticket <?php /* * 微信公众号后台里获取appId和appSecret,并在公众号后台=>安全中心=>IP白名单中设置当前页 ...

  9. QThread中的互斥、读写锁、信号量、条件变量

    该文出自:http://www.civilnet.cn/bbs/browse.php?topicno=78431 在gemfield的<从pthread到QThread>一文中我们了解了线 ...

  10. golang and intellij

    有一个项目,混合了java和go,需要在intellij中安装go的插件. OK,网上的信息简直混乱不堪,两个流派,一个流派就是装插件,一个流派就是编译插件,各种折腾,还是安装不了,谁知柳暗花明又一村 ...