您的位置:首页 > 编程语言 > Python开发

python 系统监控

2015-11-27 00:00 465 查看
#!/usr/bin/python2.7
# -*- coding:utf-8 -*-
#检查网卡流量
from __future__ import division
import commands
from datetime import datetime

"""
初始化文件
"""

try:
f=open('/tmp/rx.txt')
f1=open('/tmp/tx.txt')
f2=open('/tmp/rxt.txt')
f3=open('/tmp/txt.txt')
except IOError:
f=open('/tmp/rx.txt','w')
f1=open('/tmp/tx.txt','w')
f2=open('/tmp/rxt.txt','w')
f3=open('/tmp/txt.txt','w')
finally:
f.close()
f1.close()
f2.close()
f3.close()

def tt():
"""
计算时间节点
"""
time_now=datetime.now()
ff=open('/tmp/time.txt','r')
time_before_str=ff.read()
ff.close()
if time_before_str=='':
ffw=open('/tmp/time.txt','w')
ffw.write(str(time_now))
ffw.close()
else:
time_before=datetime.strptime(time_before_str,"%Y-%m-%d %H:%M:%S.%f")
delay=(time_now-time_before).seconds
ffw=open('/tmp/time.txt','w')
ffw.write(str(time_now))
ffw.close()
return delay

t=tt()

def RX():
"""
计算网卡每秒接收数据包的个数
"""
data1=commands.getoutput(''' ifconfig eth1| grep packets | grep RX | grep -Po "\d+" | awk 'NR==1' ''')
data=open('/tmp/rx.txt').readlines()
if len(data)==0:
f=open('/tmp/rx.txt','w')
f.write(data1)
f.close()
print "rx need next check"
else:
data=data[0]
rx=(int(data1)-int(data))/int(t)
f=open('/tmp/rx.txt','w')
f.write(data1)
f.close()
return rx

def TX():
"""
计算网卡每秒转发数据包的个数
"""
data1=commands.getoutput(''' ifconfig eth1| grep packets | grep TX | grep -Po "\d+" | awk 'NR==1' ''')
data=open('/tmp/tx.txt').readlines()
if len(data)==0:
f=open('/tmp/tx.txt','w')
f.write(data1)
f.close()
print "tx need next check"
else:
data=data[0]
rx=(int(data1)-int(data))/int(t)
f=open('/tmp/tx.txt','w')
f.write(data1)
f.close()
return rx

def RXT():
"""
计算网卡
3ff0
接收的流量
"""
data1=commands.getoutput(''' ifconfig eth1| grep 'RX bytes' | grep -Po '\d+' | awk 'NR==1' ''')
data=open('/tmp/rxt.txt').readlines()
if len(data)==0:
f=open('/tmp/rxt.txt','w')
f.write(data1)
f.close()
print "tx need next check"
else:
data=data[0]
rxt=(int(data1)-int(data))*8/1024/1024/int(t)
f=open('/tmp/rxt.txt','w')
f.write(data1)
f.close()
return rxt

def TXT():
"""
计算网卡接收的流量
"""
data1=commands.getoutput(''' ifconfig eth1| grep 'RX bytes' | grep -Po '\d+' | awk 'NR==4' ''')
data=open('/tmp/txt.txt').readlines()
if len(data)==0:
f=open('/tmp/txt.txt','w')
f.write(data1)
f.close()
print "tx need next check"
else:
data=data[0]
txt=(int(data1)-int(data))*8/1024/1024/int(t)
f=open('/tmp/txt.txt','w')
f.write(data1)
f.close()
return txt

def END():
rx=RX()
tx=TX()
rxt=RXT()
txt=TXT()
print "bond0 rx=%d packets %.2fMb,tx=%d packets %.2fMb,| RX=%d;RXT=%.2fMb;TX=%d;TXT=%.2fMb;" %(int(rx),rxt,int(tx),txt,int(rx),rxt,int(tx),txt)

if __name__ == '__main__':
END()

[root@eddy ~]# python check_traffic.py
eth1 rx=633 packets 0.22Mb,tx=6 packets 0.01Mb,| RX=633;RXT=0.22Mb;TX=6;TXT=0.01Mb;

#!/usr/bin/env python
# encoding: utf-8
#检查网卡流量
"""
-----------------------------------------------------------
total bytes:           sent: 1.49 G       received: 4.82 G
total packets:         sent: 7338724      received: 8082712
wlan0                     TOTAL         PER-SEC
-----------------------------------------------------------
bytes-sent               1.29 G        0.00 B/s
bytes-recv               3.48 G        0.00 B/s
pkts-sent               7221782               0
pkts-recv               6753724               0
eth1                      TOTAL         PER-SEC
-----------------------------------------------------------
bytes-sent             131.77 M        0.00 B/s
bytes-recv               1.28 G        0.00 B/s
pkts-sent                     0               0
pkts-recv               1214470               0
"""

import atexit
import time
import sys
try:
import curses
except ImportError:
sys.exit('platform not supported')

import psutil

# --- curses stuff
def tear_down():
win.keypad(0)
curses.nocbreak()
curses.echo()
curses.endwin()

win = curses.initscr()
atexit.register(tear_down)
curses.endwin()
lineno = 0

def print_line(line, highlight=False):
"""A thin wrapper around curses's addstr()."""
global lineno
try:
if highlight:
line += " " * (win.getmaxyx()[1] - len(line))
win.addstr(lineno, 0, line, curses.A_REVERSE)
else:
win.addstr(lineno, 0, line, 0)
except curses.error:
lineno = 0
win.refresh()
raise
else:
lineno += 1
# --- curses stuff

def bytes2human(n):
"""
>>> bytes2human(10000)
'9.8 K'
>>> bytes2human(100001221)
'95.4 M'
"""
symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
prefix = {}
for i, s in enumerate(symbols):
prefix[s] = 1 << (i + 1) * 10
for s in reversed(symbols):
if n >= prefix[s]:
value = float(n) / prefix[s]
return '%.2f %s' % (value, s)
return '%.2f B' % (n)

def poll(interval):
"""Retrieve raw stats within an interval window."""
tot_before = psutil.net_io_counters()
pnic_before = psutil.net_io_counters(pernic=True)
# sleep some time
time.sleep(interval)
tot_after = psutil.net_io_counters()
pnic_after = psutil.net_io_counters(pernic=True)
return (tot_before, tot_after, pnic_before, pnic_after)

def refresh_window(tot_before, tot_after, pnic_before, pnic_after):
"""Print stats on screen."""
global lineno

# totals
print_line("total bytes:           sent: %-10s   received: %s" % (
bytes2human(tot_after.bytes_sent),
bytes2human(tot_after.bytes_recv))
)
print_line("total packets:         sent: %-10s   received: %s" % (
tot_after.packets_sent, tot_after.packets_recv))

# per-network interface details: let's sort network interfaces so
# that the ones which generated more traffic are shown first
print_line("")
nic_names = list(pnic_after.keys())
nic_names.sort(key=lambda x: sum(pnic_after[x]), reverse=True)
for name in nic_names:
stats_before = pnic_before[name]
stats_after = pnic_after[name]
templ = "%-15s %15s %15s"
print_line(templ % (name, "TOTAL", "PER-SEC"), highlight=True)
print_line(templ % (
"bytes-sent",
bytes2human(stats_after.bytes_sent),
bytes2human(
stats_after.bytes_sent - stats_before.bytes_sent) + '/s',
))
print_line(templ % (
"bytes-recv",
bytes2human(stats_after.bytes_recv),
bytes2human(
stats_after.bytes_recv - stats_before.bytes_recv) + '/s',
))
print_line(templ % (
"pkts-sent",
stats_after.packets_sent,
stats_after.packets_sent - stats_before.packets_sent,
))
print_line(templ % (
"pkts-recv",
stats_after.packets_recv,
stats_after.packets_recv - stats_before.packets_recv,
))
print_line("")
win.refresh()
lineno = 0

def main():
try:
interval = 0
while True:
args = poll(interval)
refresh_window(*args)
interval = 1
except (KeyboardInterrupt, SystemExit):
pass

if __name__ == '__main__':
main()

total bytes:           sent: 90.69 M	  received: 11.28 G
total packets:         sent: 529772	  received: 256538131

eth1                      TOTAL         PER-SEC
bytes-sent              74.59 M      202.00 B/s
bytes-recv              10.68 G        3.31 K/s
pkts-sent                432165               1
pkts-recv             242330523              74

eth0                      TOTAL         PER-SEC                                                                                        &nb
7fe0
sp;
bytes-sent               6.23 M        0.00 B/s
bytes-recv             605.69 M      268.00 B/s
pkts-sent                 88934               0
pkts-recv              14198935               6

lo                        TOTAL         PER-SEC
bytes-sent               9.87 M        0.00 B/s
bytes-recv               9.87 M        0.00 B/s
pkts-sent                  8673               0
pkts-recv                  8673               0

检查swap
#!/usr/bin/env python
import re,os
#Swap: 0 kB
def check_swap(pid):
try:
f_name='/proc/'+pid+'/smaps'
f = open(f_name)
lines=f.readlines()
f.close()
size = 0
pattern=r'Swap:\s+(\d+)\s+KB'
for line in lines:
if re.compile(pattern).findall(line):
size += int(re.compile(pattern).findall(line)[0])
return pid,size
except:
#print "Erro"
pass
def get_name(pid):
try:
f_name='/proc/'+pid+'/status'
f = open(f_name)
line=f.readline()
f.close()
name = line.split(':')[-1].split()[0]
return name
except:
pass
if __name__=='__main__':
print 'PID\tSWAP-SIZE\tNAME'
print os.getpid()
print '----------------'
for pid in os.listdir('/proc'):
if pid.isdigit():
info = check_swap(pid)
if info :#and info[-1]:
print "%s\t%s\t%s" % (info[0],info[1],get_name(pid))

root@eddy ~]# python check_swap.py
PID	SWAP-SIZE	NAME
8907
----------------
1	0	init
2	0	kthreadd
3	0	migration/0
4	0	ksoftirqd/0
5	0	migration/0
6	0	watchdog/0
7	0	events/0
8	0	cgroup
9	0	khelper
10	0	netns
11	0	async/mgr
12	0	pm
13	0	xenwatch
14	0	xenbus

检查cpu
#!/usr/bin/env python
# encoding: utf-8
# cpu
import psutil
import  datetime
import  time
#cpu逻辑数目
print "CPU逻辑数目%d个" %psutil.cpu_count()
#cpu物理数目
print "CPU物理数目%d个" %psutil.cpu_count(logical=False)
#用户,系统,空闲百分比
cpu = psutil.cpu_times_percent(interval=1,percpu=False)
print cpu[0]
print  "user=%d%%," %cpu[0],
print  "system=%d%%," %cpu[1],
print  "idle=%d%%" %cpu[2]
[root@eddy ~]# python check_cpu.py
CPU逻辑数目1个
CPU物理数目1个
0.0
user=0%, system=0%, idle=0%

检查磁盘
#!/usr/bin/env python
# encoding: utf-8
import psutil
#disk
#查看分区
partitions = psutil.disk_partitions()
for i in partitions:
print "partitions:%s" %i[0]
#使用情况
partitions_used =  psutil.disk_usage(i[0])
print "使用率%s%%" %(partitions_used[3])
print "空闲%sG" %(partitions_used[2]/1024/1024/1024)
print "使用%sG" %(partitions_used[1]/1024/1024/1024)
print "总共%sG" %(partitions_used[0]/1024/1024/1024)
print ''
##io情况
print psutil.disk_io_counters()
print "读IO数:%s" %psutil.disk_io_counters()[0]
print "写IO数:%s" %psutil.disk_io_counters()[1]
print "读IO(MB):%sMB" %(psutil.disk_io_counters()[2]/1024/1024)
print "写IO(MB):%sMB" %(psutil.disk_io_counters()[3]/1024/1024)
print "读时间:%ss" %(psutil.disk_io_counters()[4]/1000)
print "写时间:%ss" %(psutil.disk_io_counters()[5]/1000)
print ''

[root@eddy ~]# python check_disk.py
partitions:/dev/xvda1
使用率12.2%
空闲16G
使用2G
总共19G

sdiskio(read_count=56840, write_count=614877, read_bytes=762566656, write_bytes=4527808512, read_time=234642, write_time=7270899)
读IO数:56840
写IO数:614877
读IO(MB):727MB
写IO(MB):4318MB
读时间:234s
写时间:7270s

检查运行时间
#!/usr/bin/env python
# encoding: utf-8
import psutil
import datetime
import time
##开机时间、用户登录
users_count =  len(psutil.users())
users_list = ",".join([u.name for u in psutil.users()])
print u"当前有%s个用户,分别是%s" %(users_count, users_list)
print u"开机时间:%s" %datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")

today = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
start_time = datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")
run_time = (time.time() - psutil.boot_time())/3600
print "当前时间%s" %today
print "系统已运行%0.2f小时" % run_time

[root@eddy ~]# python runtime.py
当前有3个用户,分别是eddy,eddy,eddy
开机时间:2015-10-31 12:50:52
当前时间2015-11-27 13:54:16
系统已运行649.06小时

检查内存
#!/usr/bin/env python
# encoding: utf-8
#mem
import psutil
SWAP = psutil.swap_memory()
print "total_swap=%0.2fM," %float(SWAP[0]/1024/1024),
print "used_swap=%0.2fM," %float(SWAP[1]/1024/1024),
print "free_swap=%0.2fM," %float(SWAP[2]/1024/1024),
print "used_precent=%0.2f%%" %float(SWAP[3])
MEM = psutil.virtual_memory()
print MEM
print "total_mem=%0.2fM," %float(MEM[0]/1024/1024),
print "used_mem=%0.2fM," %float(MEM[3]/1024/1024),
print "free_mem=%0.2fM," %float(MEM[1]/1024/1024),
print "used_precent=%0.2f%%" %float(MEM[2])

[root@eddy ~]# free -m
total       used       free     shared    buffers     cached
Mem:           994        898         95          0        196        479
-/+ buffers/cache:        223        770
Swap:            0          0          0
[root@eddy ~]# python check_mem.py
total_swap=0.00M, used_swap=0.00M, free_swap=0.00M, used_precent=0.00%
total_mem=994.00M, used_mem=902.00M, free_mem=767.00M, used_precent=22.00%

#查看某个进程占用内存
#!/usr/bin/env python
# encoding: utf-8
import sys
import psutil

def main():
if len(sys.argv) != 2:
sys.exit('usage: pmap <pid>')
p = psutil.Process(int(sys.argv[1]))
print("pid=%s, name=%s" % (p.pid, p.name()))
templ = "%-16s %10s  %-7s %s"
print(templ % ("Address", "RSS", "Mode", "Mapping"))
total_rss = 0
for m in p.memory_maps(grouped=False):
total_rss += m.rss
print(templ % (
m.addr.split('-')[0].zfill(16),
str(m.rss / 1024) + 'K',
m.perms,
m.path))
print("-" * 33)
print(templ % ("Total", str(total_rss / 1024 /1024) + 'M', '', ''))

if __name__ == '__main__':
main()

[root@eddy ~]# python check_mem.py 11671
pid=11671, name=epmd
Address                 RSS  Mode    Mapping
0000000000400000        32K  r-xp    /usr/lib64/erlang/erts-5.8.5/bin/epmd
000000000060a000         8K  rw-p    /usr/lib64/erlang/erts-5.8.5/bin/epmd
00000000014bf000        36K  rw-p    [heap]
0000003b7e000000         4K  r-xp    /lib64/ld-2.12.so
0000003b7e21f000         4K  r--p    /lib64/ld-2.12.so
0000003b7e220000         4K  rw-p    /lib64/ld-2.12.so

#邮件告警
#/usr/bin/python
#
#
def alarm():
msg = MIMEText('<html><h1>alarm</h1></html>','html','utf-8')
msg_to = ['eddy@eddy.com','yys@yys.com']
msg['from'] = 'eddy@eddy.com'
msg['subject'] = 'XX内存告警'
try:
server = smtplib.SMTP()
server.connect('mail.eddy.com')
server.login('eddy@eddy.com','123456')
server.sendmail(msg['from'], msg_to,msg.as_string())
server.quit()
print '发送成功'
except Exception, e:
print str(e)
if __name__ == '__main__':
if int(MEM[2]) > 80:
alarm()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: