这是以前写过的监控平台所用的系统信息收集的模块~~~~


大家可以当成模块引入到自己的脚本上。


获取系统信息的模块

利用psutil可以得到系统的各种性能指标

#-*- encoding: utf-8 -*-
import psutil
class PSU(object):
"""使用psutil检查服务器系统进程"""
def __init__(self):
"""初始化"""
self.warning_report = ""
def check_sys_status(self):
"""获取CPU,内存,硬盘的信息"""
func_list = [self.get_sys_cpu_info,
self.get_sys_mem_info,
self.get_sys_disks_info]
self.get_sys_warn_info(func_list)
"""获取web服务器进程"""
from config import webserver_process
func_list = [self.get_process_info]
self.get_sys_warn_info(func_list,
process=webserver_process,
connection=True)
"""获取数据库进程"""
from config import database_process
func_list = [self.get_process_info]
self.get_sys_warn_info(func_list,
process=database_process,
connection=False)
"""检查网络"""
func_list = [self.get_net_io]
self.get_sys_warn_info(func_list)
return self.warning_report
def get_sys_warn_info(self, func_list, **args):
for func in func_list:
#print func.__name__
msg_list = func(**args)
if msg_list:
for msg in msg_list:
'''判断报警信息'''
sys_warn_msg_list = ['warn_condiction',
'warn_num',
'warn_msg']
msg_dict = dict(zip(sys_warn_msg_list, msg))
if msg_dict['warn_condiction'] > msg_dict['warn_num']:
warn_msg = msg_dict['warn_msg']
warn_num = str(msg_dict['warn_condiction'])
self.warning_report += warn_msg + warn_num + '\n'
def get_sys_cpu_info(self):
"""获取CPU信息"""
from config import cpu_warn_percent
import time
self.cpu_percent = psutil.cpu_percent(interval=0)
time.sleep(1)
self.cpu_percent = psutil.cpu_percent(interval=1)
return [self.cpu_percent, cpu_warn_percent, "CPU占用率"],
def get_sys_mem_info(self):
"""获取MEM信息"""
from config import mem_warn_percent
self.mem = psutil.phymem_usage()
return [self.mem.percent, mem_warn_percent, "内存占用率"],
def get_sys_disks_info(self, path="/"):
"""获取硬盘信息"""
from config import disks_warn_percent
self.disks = psutil.disk_usage(path)
return [self.disks.percent, disks_warn_percent, "硬盘占用率"],
def get_process_info(self, **args):
process_name_list = args['process']
connection = args['connection']
"""获取特定进程的信息"""
for process_name in process_name_list:
p = self.get_process_by_name(process_name)
try:
self.get_process_io(p[0])
pass
except Exception, e:
#print e
#print "no such process"
pass
finally:
if connection:
#print p[0].name, "connection:"
est, syn = self.get_process_connection(p[0])
self.est = est
self.syn = syn
from config import net_warn_established, net_warn_syn
e = [est, net_warn_established, "已建立连接"]
s = [syn, net_warn_syn, "半开通连接"]
return e, s
def get_process_by_name(self, process_name):
return [process for process in psutil.process_iter()
if process_name in process.name and process.ppid == 1]
def get_process_connection(self, process):
"获取进程的连接数"
ESTABLISHED = 0
SYN_SENT = 0
for children in process.get_children():
try:
for connection in children.get_connections():
if connection.remote_address:
if connection.status == 'SYN_SENT':
SYN_SENT += 1
else:
ESTABLISHED += 1
except Exception, e:
pass
return  ESTABLISHED, SYN_SENT
def get_process_io(self, process):
"获取进程的I/O"
return process.get_io_counters()
def get_net_io(self):
"""获取网络流量信息"""
import netiostat
(neti_list, neto_list, neti_avg, neto_avg) = netiostat.get_net_io()
from config import neto_warn_avg, neti_warn_avg
self.neti_avg = neti_avg
self.neto_avg = neto_avg
o = [neto_avg, neto_warn_avg, "网络流出平均速度"]
i = [neti_avg, neti_warn_avg, "网络流入平均速度"]
return o, i
def __str__(self):
self.check_sys_status()
object_str = """
Cpus核心数目: %d
CPU使用率: %.2f%%
内存总数: %sMb
内存使用率: %.2f%%
硬盘使用率: %.2f%%
启动时间: %s
系统进程数目: %d
网络流出平均速度: %.4fk/s
网络流入平均速度: %.4fk/s
webserver已建立连接数:%d
webserver半开通连接数:%d
""" % (psutil.NUM_CPUS, self.cpu_percent,
psutil.TOTAL_PHYMEM / 1024 / 1024, self.mem.percent,
self.disks.percent, psutil.BOOT_TIME / 60,
len(psutil.get_pid_list()),
self.neto_avg, self.neti_avg, self.est, self.syn)
return object_str
if __name__ == "__main__":
p = PSU()
print p


配置信息的一个例子


#-*- encoding: utf-8 -*-
git_dir = "/tmp/gitpycheck"          # 需要监控的文件夹的绝对路径
smtp_addr = ""        # smtp地址
smtp_port = 587       # smtp端口
smtp_account = ""     # 账户
smtp_password = ""    # 密码
mailList = []         # 收件列表
mailSubject = ""      # 邮件主题
sms_notify = False
sms_userName = ""
sms_md5Key = ""
sms_sendNum = []
sms_sendTiming = 0     # 0为即时发送 1为定时发磅
sms_sendTime = ""      # 定时发送的时间
cpu_warn_percent = 70  # cpu报警使用率
mem_warn_percent = 90  # 内存报警使用率
disks_warn_percent = 80  # 硬盘报警使用率
neto_warn_avg = 2048.00  # 网络流出平均值
neti_warn_avg = 1024.00  # 网络流入平均值
net_warn_established = 200  # 已建立连接报警值
net_warn_syn = 100         # 半开通连接报警值
webserver_process = ['httpd']  # 需要监控的web服务器的进程名称
database_process = ['mysql']


短信网关 可以利用短信推送信息

#-*- encoding: utf-8 -*-
def constructData(data):
"""根据规则组成md5"""
data['Content'] = data['Content'].decode("utf-8")
data['Content'] = data['Content'].encode("gb2312")
string = "%s" * 7  % (data["ID"],
data['UserName'],
data['Md5key'],
data['SendNum'],
data['Content'],
data['SendTiming'],
data['SendTime'])
import hashlib
m = hashlib.md5(string)
data["MD5String"] = m.hexdigest()
encode = ""
import urllib
for key in data:
val = str(data[key])
formater = "%s" * 4
string = formater % (urllib.quote(key),
"=",
urllib.quote(val),
"&")
encode += string
return encode[:-1]
def posttohost(data):
"""提交短信到发送列队"""
url = "http://sms.powereasy.net/MessageGate/Message.aspx"
for num in data["sendNums"]:
data["SendNum"] = num
string = constructData(data)
import urllib2
req = urllib2.Request(url, string)
urllib2.urlopen(req)
import time
time.sleep(2)
def getTime(formater):
"""组成短信要求的时间格式"""
import time
timenow = time.time()
local = time.localtime(timenow)
return time.strftime(formater, local)
import config
data = {}
data["ID"] = getTime("%Y%m%d%H%M%S")
data["UserName"] = config.sms_userName
data["Md5key"] = config.sms_md5Key
data["Content"] = ""
data["SendTiming"] = config.sms_sendTiming
data["SendTime"] = config.sms_sendTime
data["sendNums"] = config.sms_sendNum


网络的IO的模块

#!/usr/bin/python
#coding=utf-8
from __future__ import division
import sys
import os
import time
import signal
netcmd = '/sbin/ifconfig eth0 | grep bytes'
def getnetio(line):
s1 = line.find('RX bytes:') + 9
e1 = line.find(' ', s1)
neti = line[s1:e1]
s2 = line.find('TX bytes:') + 9
e2 = line.find(' ', s2)
neto = line[s2:e2]
return (int(neti), int(neto))
def int_handler(signum, frame):
print ""
sys.exit()
def get_net_io():
signal.signal(signal.SIGINT, int_handler)
line = os.popen(netcmd).readline().strip()
netio = getnetio(line)
neti_start = netio[0]
neto_start = netio[1]
time_start = time.time()
count = 60
neti_list = []
neto_list = []
while (count > 0):
count -= 1
time.sleep(1)
info = []
line = os.popen(netcmd).readline().strip()
netio = getnetio(line)
info.append("网络流入总量:%.4fm, 网络流出总量:%.4fm"
% (netio[0] / 1024 / 1024, netio[1] / 1024 / 1024))
time_curr = time.time()
neti_total = netio[0] - neti_start
neto_total = netio[1] - neto_start
sec_total = time_curr - time_start
neti_start = netio[0]
neto_start = netio[1]
time_start = time_curr
neti_avg = neti_total / sec_total / 1024
neti_list.append(neti_avg)
neto_avg = neto_total / sec_total / 1024
neto_list.append(neto_avg)
info.append("当前网络流入速度:%.4fk/s"
% (neti_total / sec_total / 1024))
info.append("当前网络流出速度:%.4fk/s"
% (neto_total / sec_total / 1024))
info.append("当前网络平均流入速度:%.4fk/s"
% (sum(neti_list) / len(neti_list)))
info.append("当前网络平均流出速度:%.4fk/s"
% (sum(neto_list) / len(neto_list)))
#show = ", ".join(info)
#sys.stdout.write(show+"\r")
#sys.stdout.flush()
#print ""
def sort_avg(li):
li.sort()
li = li[1:-1]
return li
neti_list = sort_avg(neti_list)
neto_list = sort_avg(neto_list)
return  (neti_list, neto_list, (sum(neti_list) / len(neti_list)),
(sum(neto_list) / len(neto_list)))
if __name__ == '__main__':
print get_net_io()[3]