文档章节

python 系统监控

eddy_linux
 eddy_linux
发布于 2015/11/27 14:29
字数 1896
阅读 298
收藏 7
点赞 0
评论 0
#!/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():
    """
计算网卡接收的流量
    """
    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                                                                                                                                                           
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()


© 著作权归作者所有

共有 人打赏支持
eddy_linux
粉丝 18
博文 135
码字总数 188789
作品 0
成都
程序员
5分钟教你学会Django系统错误监控

一、监控所有的request请求 如何实现系统监控,自动发送错误日志的邮件呢? 只需配置配置settings文件即可。 1.设置发送邮件配置信息 邮件会发送到ADMINS设定的邮件列表中。 2.配置LOGGING 1...

p柯西 ⋅ 今天 ⋅ 0

监控nis服务的python监控

监控nis服务的python监控: vi a1.py #!/usr/bin/python import os ret = os.popen('netstat -ntpl | grep ypbind').readlines() if len(ret) == 0: os.system('echo " ypbind service is d......

yangzhimingg ⋅ 06/15 ⋅ 0

Python Scrapy 爬虫(三):部署环境搭建

当我们的爬虫程序开发完成后,应该考虑的事情就是如何将我们的爬虫程序部署到我们的服务器上来运行了。 下面就以 CentOS 作为我们的爬虫程序的部署环境来介绍部署爬虫的第一步:部署环境搭建...

雨林_a1d6 ⋅ 05/29 ⋅ 0

报错EnvironmentError: mysql_config not found

MySQL for Python library在Python中也就相当于JAVA中对应MySQL的JDBC Driver 1. 首先安装mysql sudo apt-get install mysql-server 2. 安装mysql-python 下载MySQL-python-1.2.3.tar.gz(见......

jalyzjs ⋅ 05/12 ⋅ 0

Centos7下安装python3并安装虚拟环境

引言 服务器自带的python版本大多是2.X,而且有些系统应用依赖于默认的python环境。但有时候要用到python3,为了不与系统的python环境相冲突,就新安装python3版本并使用虚拟环境。 安装准备...

_缘君_ ⋅ 05/02 ⋅ 0

你真的了解Python吗?这篇文章让你了解90%

  【IT168 评论】人们为什么使用Python?   之所以选择Python的主要因素有以下几个方面:   软件质量:在很大程度上,Python更注重可读性、一致性和软件质量,从而与脚本语言世界中的其...

博客园 ⋅ 05/21 ⋅ 0

DNS模块dnspython应用及业务监控示例

1 dnspython处理模块的安装,源码方式 wget http://www.dnspython.org/kits/1.9.4/dnspython-1.9.4.tar.gz tar zxf dnspython-1.9.4.tar.gz cd dnspython-1.9.4/ python setup.py install 2......

super李导 ⋅ 05/08 ⋅ 0

supervisor安装和配置指南

supervisor:是用python写的一个进程管理工具,用来启动,重启,关闭进程。 注意:Supervisor只能管理非daemon的进程,也就是说Supervisor不能管理守护进程。否则提示Exited too quickly (p...

高运维之路 ⋅ 05/03 ⋅ 0

云计算培训学院,云计算Python自动化运维开发实战

都忘记是什么时候知道python的了,我是搞linux运维的,早先只是知道搞运维必须会shell,要做一些运维自动化的工作,比如实现一些定时备份数据啊、批量执行某个操作啊、写写监控脚本什么的。后...

长沙千锋 ⋅ 05/15 ⋅ 0

python2.7.5升级到3.5.0

当前系统版本centos7.2_x64 1.查看当前python版本 python -V Python 2.7.5 2.下载python3.5.0版本 wget https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz 3.解压和安装 tar -xvf P......

静听的风 ⋅ 05/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊spring cloud gateway的LoadBalancerClientFilter

序 本文主要研究一下spring cloud gateway的LoadBalancerClientFilter GatewayLoadBalancerClientAutoConfiguration spring-cloud-gateway-core-2.0.0.RELEASE-sources.jar!/org/springfram......

go4it ⋅ 44分钟前 ⋅ 0

详解:Nginx反代实现Kibana登录认证功能

Kibana 5.5 版后,已不支持认证功能,也就是说,直接打开页面就能管理,想想都不安全,不过官方提供了 X-Pack 认证,但有时间限制。毕竟X-Pack是商业版。 下面我将操作如何使用Nginx反向代理...

问题终结者 ⋅ 50分钟前 ⋅ 0

002、nginx配置虚拟主机

一、nginx配置虚拟主机可分为三种方式,分别为: 1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站...

北岩 ⋅ 53分钟前 ⋅ 0

shell脚本之死循环写法

最近在学习写shell脚本,在练习if while等流程控制时,突然它们的死循环写法是怎么样的?经过百度与亲测记录如下: for死循环 #! /bin/bashfor ((;;));do date sleep 1d...

hensemlee ⋅ 55分钟前 ⋅ 0

苹果的ARKit2.0有多可怕,看了就知道

序言 ARKit主要由三部分组成: 跟踪(Tracking) 跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。 2.场景理解(Scene Understanding) 场...

_小迷糊 ⋅ 56分钟前 ⋅ 0

5.1 vim介绍 5.2 vim移动光标 5.3 ,5.4vim一般模式下移动光标,复制粘贴

vim命令 vim是vi的一个升级版;vim可以显示文字的颜色 安装vim这一个包vim-enhanced 如果不知道安装包,可以使用 命令下面命令来查看vim命令是那个包安装的。 [root@linux-128 ~]# yum prov...

Linux_老吴 ⋅ 今天 ⋅ 0

vim一般模式

vim 是什么 vim是什么 ? 在之前接触Linux,编辑网卡配置文件的时候我们用过了vi ,vim简单说就是vi的升级版,它跟vi一样是Linux系统中的一个文本编辑工具。 如果系统中没有vim ,需要安装一...

李超小牛子 ⋅ 今天 ⋅ 0

docker实战

构建企业级Docker虚拟化平台实战 重点剖析虚拟化和云计算概念; 分析Docker虚拟化的概念和原理; 从0开始实战Docker虚拟化平台; 基于Docker构建Nginx WEB服务器和CentOS虚拟机; 基于开源监...

寰宇01 ⋅ 今天 ⋅ 0

vim介绍、vim颜色显示和移动光标、vim一般模式下移动光标、一般模式下复制粘贴剪切

VIM Vim 是 UNIX 文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff),语法高亮,全面的帮助系统,本地脚本(Vimscript),和便于选择的...

蛋黄Yolks ⋅ 今天 ⋅ 0

springboot+mockito测试controller层遇到的问题

使用MockitoJUnitRunner测试的一个例子,原来报错无法找到bean, 类似的异常如下:createBeanError..... 原因:是因为@Runwith使用了SpringRunner,应该修改为MockitoJUnitRunner 代码如下: ...

writeademo ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部