python 写一个类似于top的监控脚本

最近老板给提出一个需要,项目需求大致如下:

 1、用树莓派作为网关,底层接多个ZigBee传感节点,网关把ZigBee传感节点采集到的信息通过串口接收汇总,并且发送给上层的HTTP Server;

2、要有数据的反向控制通道,即网关与Server间要保持长连接,采用websocket实现,以此实现给ZigBee传感节点发送控制命令,来实现对ZigBee节点的远程配置操作;
3、树莓派网关本身要与上层Server实现交互,上层Server能够看到网关实时的cpu、内存以及网络上行与下行的带宽等等;

前两条需求在前一段时间已经基本实现,等后续有时间完善之后在整理,今天记录一下第三条的实现过程。

感觉第三条需求很像目前公司用到的监控系统的一个小的底层实现,因为前几天无聊刚好搭了个zabbix的环境玩了玩,感觉老板的需求在前端上好像就是类似于zabbix Server上的那种展现形式,但是用zabbix实在感觉不够灵活,其实我也用不明白,只能实现一个类似于top工具的监控脚本吧,先把实时的cpu、内存、网络流量等信息在本地表现出来,等待后续和Server端的朋友联调再说,代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#############################
#__author__ = ‘webber‘      #
#create at 2016/12/12       #
#############################
import os
import sys
import time

def cpuinfo():
    """
    get cpuinfo from ‘/proc/stat‘ and
    calculate the percentage of the cpu occupy.
    """
    f = open(‘/proc/stat‘,‘r‘)
    cpu = f.readline()
    f.close()
    #print "cpuinfo: ", cpu
    cpu = cpu.split(" ")
    total = 0
    usr = float(cpu[2])     #用户态cpu占用率
    _sys = float(cpu[4])    #内核态cpu占用率
    for info in cpu:
        if info.isdigit():
            total += float(info)
    print ‘\033[31mcpu info:  \033[0m‘,
    print ‘usr: %.5f%%‘ % ((usr/total)*100),
    print ‘     sys: %.5f%%‘ % ((_sys/total)*100)

def meminfo():
    """
    get meminfo from ‘/proc/meminfo‘ and
    calculate the percentage of the mem occupy
    used = total - free - buffers - cached
    """
    f = open(‘/proc/meminfo‘,‘r‘)
    mem = f.readlines()
    f.close()
    #print "meminfo", mem
    total, free, buffers, cached = 0, 0, 0, 0
    for info in mem:
        mem_item = info.lower().split()
        #print mem_item
        if mem_item[0] == ‘memtotal:‘:
            total = float(mem_item[1])
        if mem_item[0] == ‘memfree:‘:
            free = float(mem_item[1])
        if mem_item[0] == ‘buffers:‘:
            buffers = float(mem_item[1])
        if mem_item[0] == ‘cached:‘:
            cached = float(mem_item[1])
    used = total - free - buffers - cached
    print "\033[31mmeminfo:  \033[0m",
    print "total: %.2f GB" % (total/1024/1024),
    print "     used: %.5f%%" % (used/total)

def netinfo():
    """
    get real-time bandwidth
    """
    f = open(‘/proc/net/dev‘,‘r‘)
    net = f.readlines()
    f.close()

    net_item = []
    for info in net:
        if info.strip().startswith("eth0"):
            net_item = info.strip().split()
            break
    # print net_item
    recv = float(net_item[1])
    send = float(net_item[9])
    #print "recv:%s " % recv
    #print "send:%s " % send
    time.sleep(1)

    f2 = open(‘/proc/net/dev‘,‘r‘)
    _net = f2.readlines()
    f2.close()
    _net_item = []
    for info in _net:
        if info.strip().startswith("eth0"):
            _net_item = info.strip().split()
            break
    recv_2 = float(_net_item[1])
    send_2 = float(_net_item[9])

    #print "recv_2:%s " % recv_2
    #print "send_2:%s " % send_2
    print "\033[31m network info:  \033[0m"
    print "received: %.3f Kb/s" % (recv_2/1024 - recv/1024)
    print "transmit: %.3f kb/s" % (send_2/1024 - send/1024)

def loadavg():
    pass

def disk():
    pass

if __name__ == ‘__main__‘:
    while True:
        try:
            os.system(‘clear‘)
            cpuinfo()
            print "=============================================="
            meminfo()
            print "##############################################"
            netinfo()
            time.sleep(5)
        except KeyboardInterrupt, e:  # 这里也可以用信号函数来处理
            print ‘‘
            print "BYE-BYE"
            sys.exit(0)
时间: 2024-12-31 03:42:05

python 写一个类似于top的监控脚本的相关文章

用python写一个专业的传参脚本

问:linux系统命令如ls,它有几十个参数,可带一个或多个参数,可不分先后,用起来是非常的专业.但是自己写的传参脚本,一般只传一个参数,如果传多个,也是固定的顺序,那么如何用python写出更专业的传参脚本呢? 答:使用python自带的getopt模块. 1.语法: import getopt getopt.getopt(args,shortopts, longopts=[]) #函数示例:getopt.getopt(sys.argv[1:],'u:p:P:h',["username=&qu

利用python写一个有道翻译的脚本

废话不多说,直接上代码 import urllib.request import urllib.parse import json content = input("请输入要翻译的内容:") url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null' data = {} data['type'] = 'AU

用Python写一个ftp下载脚本

用Python写一个ftp下载脚本 ----基于Red Hat Enterprise Linux Server release 6.4 (Santiago):python 2.6.6 Ps:少侠我接触Python半个月以来接到的第一个需求,虽然如此简单的一个脚本,少侠我磕磕绊绊却用了将近一天半的时间才写出来,但还是很开心,毕竟也粗来了,废话不多说,切入正题.因为一开始没有用过ftplib模块,所以各种谷歌度娘一堆资料杂乱不堪,话不清,理不乱的,本文实现的功能简单,下面介绍一下,以免误导读者. 需

老男孩教育每日一题-2017-04-17:使用Shell或Python写一个脚本,CPU使用率超过80%或硬盘超过85%邮件报警

老男孩教育每日一题-2017-04-17: 使用Shell或Python写一个脚本,CPU使用率超过80%或硬盘超过85%邮件报警. 今天是老男孩教育每日一题陪伴大家的第29天.

python写一个脚本解析文件

Python写一个脚本解析文件 ----基于Red Hat Enterprise Linux Server release 6.4 (Santiago):python 2.6.6 需求: 1.去掉空行 2.去掉空行后输出到一个新文件 附加需求(排版):1.'-'缩进n个字符 '-'缩进2n个字符 以此类推 2.'-'开头的所有句子输出在一行 '-'开头的句子输出在一行 以此类推 --------------------------------------------分隔线------------

[py]python写一个通讯录step by step V3.0

python写一个通讯录step by step V3.0 参考: http://blog.51cto.com/lovelace/1631831 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输出 2.把日期换算成年龄 3.更新操作做的更优雅 准备工作 db准备 - 创建数据库 mysql> create database txl charset utf8; Query OK, 1 row affecte

十行代码--用python写一个USB病毒 (知乎 DeepWeaver)

昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到.但是,如果我想,比如,当一个usb插入时,在后台自动把usb里的重要文件神不知鬼不觉地拷贝到本地或者上传到某个服务器,就需要特殊的软件辅助. 于是我心想,能不能用python写一个程序,让它在后台运行.每当有u盘插入的时候,就自动拷贝其中重要文件. 如何判断U盘的插入与否? 首先我们打开电脑终端,进入/Volume

python写一个通讯录V2.0

python写一个通讯录step by step V2.0 引用知识 list + dict用于临时存储用户数据信息 cPickle用于格式化文件存取 依旧使用file来进行文件的存储 解决问题 1.操刀开始去做 原始代码 实现功能(可做模板) 1.判断输入内容是否在给出的menu目录内,在的话,返回对应结果,不在就报错 2.调用os模块的exit功能 3.字典配合循环加上函数实现switch的功能 #!/usr/bin/env python #coding:utf8 #Author:zhuim

python写一个通讯录

闲着没事,用python写一个模拟通讯录,要求要实现常用的通讯录的功能,基本流程如下 ? 接下来就按照这个流程实现各个模块的功能 1. 定义一个类,并初始化 1 import json 2 import time 3 4 5 class Address(object): 6 def __init__(self): 7 with open("通讯录.txt", 'r', encoding='utf-8') as f: 8 self.data = json.loads(f.read())