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,如需转载请自行联系原作者

相关文章
|
2月前
|
数据采集 测试技术 C++
无headers爬虫 vs 带headers爬虫:Python性能对比
无headers爬虫 vs 带headers爬虫:Python性能对比
|
16天前
|
网络协议 API 开发者
分析http.client与requests在Python中的性能差异并优化。
合理地选择 `http.client`和 `requests`库以及在此基础上优化代码,可以帮助你的Python网络编程更加顺利,无论是在性能还是在易用性上。我们通常推荐使用 `requests`库,因为它的易用性。对于需要大量详细控制的任务,或者对性能有严格要求的情况,可以考虑使用 `http.client`库。同时,不断优化并管理员连接、设定合理超时和重试都是提高网络访问效率和稳定性的好方式。
61 19
|
14天前
|
网络协议 API Python
解析http.client与requests在Python中的性能比较和改进策略。
最后,需要明确的是,这两种库各有其优点和适用场景。`http.client` 更适合于基础且并行的请求,`requests` 则因其易用且强大的功能,更适用于复杂的 HTTP 场景。对于哪种更适合你的应用,可能需要你自己进行实际的测试来确定。
44 10
|
7月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
412 3
|
7月前
|
缓存 算法 Linux
深入理解Linux内核调度器:公平性与性能的平衡####
真知灼见 本文将带你深入了解Linux操作系统的核心组件之一——完全公平调度器(CFS),通过剖析其设计原理、工作机制以及在实际系统中的应用效果,揭示它是如何在众多进程间实现资源分配的公平性与高效性的。不同于传统的摘要概述,本文旨在通过直观且富有洞察力的视角,让读者仿佛亲身体验到CFS在复杂系统环境中游刃有余地进行任务调度的过程。 ####
113 6
|
5月前
|
测试技术 数据库 Python
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
169 61
Python装饰器实战:打造高效性能计时工具
|
3月前
|
缓存 并行计算 数据处理
全面提升Python性能的十三种优化技巧
通过应用上述十三种优化技巧,开发者可以显著提高Python代码的执行效率和性能。每个技巧都针对特定的性能瓶颈进行优化,从内存管理到并行计算,再到使用高效的数值计算库。这些优化不仅能提升代码的运行速度,还能提高代码的可读性和可维护性。希望这些技巧能帮助开发者在实际项目中实现更高效的Python编程。
282 22
|
3月前
|
缓存 安全 Android开发
Python实战:搭建短信转发器,实现验证码自动接收与处理
在移动互联网时代,短信验证码是重要的安全手段,但手动输入效率低且易出错。本文介绍如何用Python搭建短信转发器,实现验证码自动接收、识别与转发。通过ADB工具监听短信、正则表达式或ddddocr库提取验证码,并利用Flask框架转发数据。系统支持多设备运行,具备安全性与性能优化功能,适合自动化需求场景。未来可扩展更多功能,提升智能化水平。
225 1
|
5月前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
435 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
4月前
|
安全 数据处理 索引
深入探讨 Python 列表与元组:操作技巧、性能特性与适用场景
Python 列表和元组是两种强大且常用的数据结构,各自具有独特的特性和适用场景。通过对它们的深入理解和熟练应用,可以显著提高编程效率和代码质量。无论是在数据处理、函数参数传递还是多线程环境中,合理选择和使用列表与元组都能够使得代码更加简洁、高效和安全。
108 9