python获取linux系统信息、性能阀值、短信网关发送的例子

简介:

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


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


获取系统信息的模块

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#-*- 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:
=  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
=  [est, net_warn_established,  "已建立连接" ]
=  [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
=  [neto_avg, neto_warn_avg,  "网络流出平均速度" ]
=  [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__" :
=  PSU()
print  p


配置信息的一个例子


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#-*- 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' ]


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#-*- 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
=  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的模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/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 ]





 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1202702,如需转载请自行联系原作者

相关文章
|
14天前
|
网络协议 Linux Python
Python网络编程基础(Socket编程)epoll在Linux下的使用
【4月更文挑战第12天】在上一节中,我们介绍了使用`select`模块来实现非阻塞IO的方法。然而,`select`模块在处理大量并发连接时可能会存在性能问题。在Linux系统中,`epoll`机制提供了更高效的IO多路复用方式,能够更好地处理大量并发连接。
|
14天前
|
存储 缓存 算法
优化Python代码性能的7个技巧
在日常的Python开发中,优化代码性能是一个重要的课题。本文介绍了7个实用的技巧,帮助开发者提高Python代码的执行效率,包括利用生成器表达式、使用适量的缓存、避免不必要的循环等。通过本文的指导,读者可以更好地理解Python代码性能优化的方法,提升自身的编程水平。
|
14天前
|
算法 Java 编译器
优化Python代码性能的实用技巧
提高Python代码性能是每个开发者的关注焦点之一。本文将介绍一些实用的技巧和方法,帮助开发者优化他们的Python代码,提升程序的执行效率和性能。
|
10天前
|
存储 数据挖掘 数据处理
【Python DataFrame 专栏】优化 DataFrame 性能:提升数据处理效率的秘诀
【5月更文挑战第19天】优化 Python DataFrame 性能的关键点包括:选择合适的数据类型以节省内存,避免重复计算,利用向量化操作,考虑使用 `iterrows` 或 `itertuples` 迭代,优化索引以及借助 `Cython` 或 `Numba` 加速代码执行。通过这些策略,能提升数据处理效率,应对大规模数据挑战。
【Python DataFrame 专栏】优化 DataFrame 性能:提升数据处理效率的秘诀
|
10天前
|
机器学习/深度学习 数据采集 Java
如何提高Python程序的性能
Python作为一种高级编程语言,具有易学易用、开发效率高等优点,但其在性能上可能不如C++或Java。本文将介绍如何通过一些技巧和工具来提高Python程序的性能。
|
12天前
|
Web App开发 Ubuntu Linux
Linux无图形界面环境使用Python+Selenium实践
【5月更文挑战第1天】Linux无图形界面环境使用Python+Selenium实践
60 2
|
14天前
|
编解码 Ubuntu Linux
|
14天前
|
Oracle Java 关系型数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
19 6
|
14天前
|
Linux Perl
linux如何查看系统信息
linux如何查看系统信息
18 2
|
14天前
|
消息中间件 程序员 调度
Python并发编程:利用多线程提升程序性能
本文探讨了Python中的并发编程技术,重点介绍了如何利用多线程提升程序性能。通过分析多线程的原理和实现方式,以及线程间的通信和同步方法,读者可以了解如何在Python中编写高效的并发程序,提升程序的执行效率和响应速度。