思路主要是用python脚本获取linux服务器的各种状态信息,然后用webserver的方式,以json数据发给http,主控节点去读取webserver返回的json,生成系统监控报表。代码简单,开发和部署都很方便。

用到的主要东西是python的第三方嵌入式web模块叫cherrypy,之所以选择cherrypy,主要原因就是开发快速,学习也很快,基本我用了一天多就基本学会了怎么来写了。当然,也可以用python自带的simpleHTTPserver。不过那个确实太simple了。cherrypy的优点在于,多线程,多并发。又不像Tornado和Django那样重量级。因为我们返回的是json,也用不到什么html模板,数据库的功能。当然也可以选择web.py,不过相比还是cherrypy更好一点我认为,web.py也借鉴了cherrypy不少的思想。

主要流程是这样:

想办法读取Linux系统的各种数据  --->  解析数据转成json发给http服务器  --->  监控服务器扫描数据生成图表

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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
#!/usr/bin/python
# -*- coding: utf8 -*-
import sys
import cherrypy
import platform
import os
import time
#python 2.4为simplejson,python 2.6以上为json
try:
    import json
except ImportError:
    import simplejson as json
                                                                                
#假装做一个index出来
class Index(object):
    #下面这句表示修饰index方法,这个index方法是暴露给http server的
    @cherrypy.expose
    def index(self):
        return "hello cherrypy"
                                                                                    
class Node(object):
    '''
    url /node/dist/
    '''
    #获取目标机器的发行分支,版本号,架构类型,主机名称等等,返回json
    @cherrypy.expose
    def dist(self):
        dist_json = ''
        sysinstaller = ''
        installer = ''
        ostype = platform.dist()
        if(ostype[0in ['Ubuntu','debian','ubuntu','Debian']):
            sysinstaller = 'apt-get'
            installer = 'dpkg'
        elif(ostype[0in ['SuSE']):
            sysinstaller = 'zypper'
            installer = 'rpm'
        elif(ostype[0in ['CentOS''centos''redhat','RedHat']):
            sysinstaller = 'yum'
            installer = 'rpm'
            machine = platform.machine()
        hostname = platform.node()
                                                                                    
        dist_json = {'os.system':ostype[0], 'os.version':ostype[1], 'os.release':ostype[2], 'os.sysinstall':sysinstaller, 'os.installer':installer, 'os.arch':machine, 'os.hostname':hostname}
        return json.dumps(dist_json, sort_keys=False, indent=4, separators=(','': '))
    '''
    url /node/GetCpuInfo/
    '''
    #获取CPU型号等,返回json
    @cherrypy.expose
    def GetCpuInfo(self):
        cpu = []
        cpuinfo = {}
        = open("/proc/cpuinfo")
        lines = f.readlines()
        f.close()
        for line in lines:
            if line == 'n':
                cpu.append(cpuinfo)
                cpuinfo = {}
            if len(line) < 2continue
            name = line.split(':')[0].strip().replace(' ','_')
            var = line.split(':')[1].strip()
            cpuinfo[name] = var
        return json.dumps(cpuinfo, sort_keys=False, indent=4, separators=(','': '))
    '''
    url /node/GetMemInfo/
    '''
    #获取内存使用的详细信息
    @cherrypy.expose
    def GetMemInfo(self):
        mem = {}
        = open("/proc/meminfo")
        lines = f.readlines()
        f.close()
        for line in lines:
            if len(line) < 2:
                   continue
            name = line.split(':')[0]
            var = line.split(':')[1].split()[0]
            mem[name] = long(var) * 1024.0
        mem['MemUsed'= mem['MemTotal'- mem['MemFree'- mem['Buffers'- mem['Cached']
        return json.dumps(mem, sort_keys=False, indent=4, separators=(','': '))
    '''
    url /node/GetLoadAvg//
    '''
    #获取系统负载的详细信息
    @cherrypy.expose
    def GetLoadAvg(self):
        loadavg = {}
        = open("/proc/loadavg")
        con = f.read().split()
        f.close()
        loadavg['lavg_1']=con[0]
        loadavg['lavg_5']=con[1]
        loadavg['lavg_15']=con[2]
        loadavg['nr']=con[3]
        loadavg['last_pid']=con[4]
        return json.dumps(loadavg, sort_keys=False, indent=4, separators=(','': '))
    '''
    url /node/GetIfInfo/eth(x)
    '''
    获取指定网卡的流量信息,这里面有点复杂
    @cherrypy.expose
    def GetIfInfo(self, interface):
        dist_json = self.dist()
        = open("/proc/net/dev")
        lines = f.readlines()
        f.close()
        intf = {}
        for line in lines[2:]:
            con = line.split()
            #if部分是给centos使用的,centos在流量大的情况下,网卡信息里面字符串会连上,所以需要单独拆分处理,else部分则是ubuntu或者其他系统格式化很好的使用
            if con[0][-1].isdigit() == True:
                offset = con[0].split(':')
                intf['interface'= str(offset[0])
                intf['ReceiveBytes'= str(offset[1])
                intf['ReceivePackets'= str(con[1])
                intf['ReceiveErrs'= str(con[2])
                intf['ReceiveDrop'= str(con[3])
                intf['ReceiveFifo'= str(con[4])
                intf['ReceiveFrames'= str(con[5])
                intf['ReceiveCompressed'= str(con[6])
                intf['ReceiveMulticast'= str(con[7])
                intf['TransmitBytes'= str(con[8])
                intf['TransmitPackets'= str(con[9])
                intf['TransmitErrs'= str(con[10])
                intf['TransmitDrop'= str(con[11])
                intf['TransmitFifo'= str(con[12])
                intf['TransmitFrames'= str(con[13])
                intf['TransmitCompressed'= str(con[14])
                intf['TransmitMulticast'= str(con[15])
            else:
                intf['interface'= str(con[0])
                intf['ReceiveBytes'= str(con[1])
                intf['ReceivePackets'= str(con[2])
                intf['ReceiveErrs'= str(con[3])
                intf['ReceiveDrop'= str(con[4])
                intf['ReceiveFifo'= str(con[5])
                intf['ReceiveFrames'= str(con[6])
                intf['ReceiveCompressed'= str(con[7])
                intf['ReceiveMulticast'= str(con[8])
                intf['TransmitBytes'= str(con[9])
                intf['TransmitPackets'= str(con[10])
                intf['TransmitErrs'= str(con[11])
                intf['TransmitDrop'= str(con[12])
                intf['TransmitFifo'= str(con[13])
                intf['TransmitFrames'= str(con[14])
                intf['TransmitCompressed'= str(con[15])
                intf['TransmitMulticast'= str(con[16])
        return json.dumps(intf, sort_keys=False)
    #获取全部网卡的接口和流量信息
    @cherrypy.expose
    def GetIfTraffic(self):
        ifs = []
        nettraffic = {}
        = open("/proc/net/dev")
        lines = f.readlines()
        f.close()
        for line in lines[2:]:
            con = line.split()
            ifname = con[0].split(':')
            if(ifname[0].strip() != 'lo'):
                ifs.append(ifname[0].strip())
            else:
                continue
        for interface in ifs:
            nettraffic[interface] = self.GetIfInfo( interface)
                                                                                    
        return json.dumps(nettraffic)
    #获取硬盘的分区信息和使用量
    @cherrypy.expose
    def GetHddInfo(self):
        hdds = []
        mount = {}
        file_system = []
        type = []
        size = []
        used = []
        avail = []
        used_percent = []
        mounted_on = []
        hdds = os.popen('df -lhT  | grep -v tmpfs | grep -v boot | grep -v usr | grep -v tmp | sed \'1d;/ /!N;s/\\n//;s/[ ]*[ ]/\\t/g;\'').readlines()
        for line in hdds:
            file_system.append(line.replace('\\n','').replace('\\t',' ').split()[0])
            type.append(line.replace('\\n','').replace('\\t',' ').split()[1])
            size.append(line.replace('\\n','').replace('\\t',' ').split()[2])
            used.append(line.replace('\\n','').replace('\\t',' ').split()[3])
            avail.append(line.replace('\\n','').replace('\\t',' ').split()[4])
            used_percent.append(line.replace('\\n','').replace('\\t',' ').split()[5])
            mounted_on.append(line.replace('\\n','').replace('\\t',' ').split()[6])
        mount['file_system'= file_system
        mount['type'= type
        mount['size'= size
        mount['used'= used
        mount['avail'= avail
        mount['used_percent'= used_percent
        mount['mounted_on'= mounted_on
        dist_json = json.dumps(mount)
        return dist_json
                                                                                
    #获取CPU的使用量信息,需要系统安装sysstat支持
    @cherrypy.expose
    def GetCpuDetail(self):
        dist_json = self.dist()
        dist = json.loads(dist_json)
        if(dist['os.system'in ['CentOS''centos''redhat''RedHat']):
            if(int(dist['os.version'].split('.')[0])  < 6):  #For CentOS only
                cmd = 'mpstat 1 1 | sed \'1d;2d;3d;4d\' | awk \'{print "{\\\"user\\\":\\\"\"$3\"\\\",\\\"nice\\\":\\\"\"$4\"\\\",\\\"sys\\\":\\\"\"$5\"\\\",\\\"iowait\\\":\\\"\"$6\"\\\",\\\"irq\\\":\\\"\"$7\"\\\",\\\"soft\\\":\\\"\"$8\"\\\",\\\"steal\\\":\\\"\"$9\"\\\",\\\"idle\\\":\\\"\"$10\"\\\"}"}\''
            else:
                cmd = 'mpstat 1 1 | sed \'1d;2d;3d;4d\' | awk \'{print "{\\\"user\\\":\\\"\"$3\"\\\",\\\"nice\\\":\\\"\"$4\"\\\",\\\"sys\\\":\\\"\"$5\"\\\",\\\"iowait\\\":\\\"\"$6\"\\\",\\\"irq\\\":\\\"\"$7\"\\\",\\\"soft\\\":\\\"\"$8\"\\\",\\\"steal\\\":\\\"\"$9\"\\\",\\\"idle\\\":\\\"\"$11\"\\\"}"}\''
        else:
            cmd = 'mpstat 1 1 | sed \'1d;2d;3d;4d\' | awk \'{print "{\\\"user\\\":\\\"\"$3\"\\\",\\\"nice\\\":\\\"\"$4\"\\\",\\\"sys\\\":\\\"\"$5\"\\\",\\\"iowait\\\":\\\"\"$6\"\\\",\\\"irq\\\":\\\"\"$7\"\\\",\\\"soft\\\":\\\"\"$8\"\\\",\\\"steal\\\":\\\"\"$9\"\\\",\\\"idle\\\":\\\"\"$11\"\\\"}"}\''
        cpu = os.popen(cmd).readline().strip()
        return cpu
if "__main__" == __name__:
    #服务器配置
    settings = {
                'global': {
                    #绑定端口
                    'server.socket_port' 60090,
                    #ip地址设置,觉得够安全就用0.0.0.0,否则就单独写那台服务器的ip
                    'server.socket_host''0.0.0.0',
                    'server.socket_file': '',
                    'server.socket_queue_size'100,
                    'server.protocol_version''HTTP/1.1',
                    'server.log_to_screen'True,
                    'server.log_file': '',
                    'server.reverse_dns'False,
                    'server.thread_pool'200,
                    'server.environment''production',
                    'engine.timeout_monitor.on'False
                }
        }
        #使用配置和映射路由并启动webserver
        cherrypy.config.update(settings)
        cherrypy.tree.mount(Index(), '/')
        cherrypy.tree.mount(Node(), '/node')
        cherrypy.engine.start()

python 嵌入式webserver 服务器 状态监控相关推荐

  1. 怎么修改监控服务器的密码,服务器状态监控怎么设置密码

    服务器状态监控怎么设置密码 内容精选 换一换 本节操作介绍购买云耀云服务器的操作步骤.购买时,为减少您配置参数的时间,部分参数由系统自动分配,以下参数配置供你了解系统的默认配置.购买云耀云服务器仅支持 ...

  2. java项目实现服务器监控,Java实现服务器状态监控

    Java实现服务器状态监控 内容精选 换一换 云容器实例(Cloud Container Instance,CCI)服务提供 Serverless Container(无服务器容器)引擎,让您无需创建 ...

  3. 服务器状态监控app,服务器/网站连接状态监控工具

    本工具是监听服务器或者网站状态的工具,一次可以批量检测多个IP或者服务器,工具是由概念网络自主开发的,本工具为收费软件,没有免费版本下载,程序是用C#开发,需要.Net Framework 3.5及以 ...

  4. 【开源软件】服务器状态监控通知平台

    声明:   本文仅以学习交流为目的分享自己的开发成果,希望为更多人提供开发设计的思路,还请善待笔者的开发成果.有任何问题欢迎在文章下方留言或私信,也欢迎评论或私信指教,和大家共同进步! 1. Serv ...

  5. 基于嵌入式webserver的服务器状态监控

    其实也是在easyhadoop做第二次重构的时候用到了这个嵌入式的webserver去做服务器状态的监控,可以单独摘出来写个东西. 思路主要是用python脚本获取linux服务器的各种状态信息,然后 ...

  6. 服务器状态监控之一背景介绍及解决方案建议

    SCOM与SCVMM 一.背景介绍 XXX公司是一家外商独资企业,主要致力于高品质零售商用地产的投资.开发和管理,其在国内大部分一线及部分二级城市都有分公司或是连锁购中心,随着公司业务规模的不断壮大增 ...

  7. Jmeter压力测试简单教程(包括服务器状态监控)-----转载自lsoqvle 的博客(https://blog.csdn.net/cbzcbzcbzcbz/article/details/780)

    步骤一  安装Jmeter 我用的版本是3.1版本,为什么是3.1,因为3.2有问题,我也是跑了一段时间后才知道3.2版本太新了还是什么的,有些功能就是不行,在此建议大家,不要轻易使用最新版本,次新版 ...

  8. dell服务器状态监控系统,Nagios监控Dell服务器硬件状态

    Nagios监控Dell服务器 Server: check_openmanage 是一个 Nagios 的插件,它基于 OMSA 获取相关的报道信息,用来检测安装有 OpenManage Server ...

  9. 服务器状态监控之二软硬件环境介绍

    SCOM与SCVMM 第二章 软硬件环境介绍 要想实现SCOM的安装,以及实现SCOM与SCVMM(HyperV R2)相结合,需要较好的硬件支持,在此感谢DELL公司提供的DELL R710服务器. ...

  10. 服务器状态监控php源码,服务器状态监控_监控Linux服务器网站状态的SHELL脚本

    摘要 腾兴网为您分享:监控Linux服务器网站状态的SHELL脚本,蜗牛集市,同花顺,探客宝,手柄助手等软件知识,以及日期倒计时插件,云南省教育资源公共,rui手机桌面,小屁孩桌面便签,合金装备崛起复 ...

最新文章

  1. java runnable 启动_Java开发笔记(九十七)利用Runnable启动线程
  2. 验证 Boost.Optional 复制构造函数不会尝试调用从模板化参数初始化构造函数的元素类型
  3. SAP Spartacus界面注册用户获取OAuth Access Token的方式
  4. Android之解决卸载app后再次安装提示room数据库错误
  5. c c 语言编程项目实例,实例分享cmake编译一个简单c++项目(demo)
  6. 安装nodejs插件并在sublime text 3上使用
  7. HashMap中capacity、loadFactor、threshold、size等概念的解释
  8. 网站页面黑白色效果实现技巧
  9. testbench实例 vhdl_VHDL TestBench基础(转)
  10. 计算机专用英语词汇(方便大家学习)
  11. 主页 被 2345 篡改怎么办
  12. Android系统开启蓝牙源码分析(上)
  13. virt-manger创建虚拟机及virtio网卡
  14. 海南“多规合一”改革促行政审批提速城乡面貌提质
  15. 极简椭圆曲线密码学入门
  16. centos上启动mysql_centos下怎么启动mysql
  17. Python 字节数组 和 16进制字符串转换
  18. 如何卸载手机系统应用
  19. Vmware 11 安装 Mac OS 提示不可恢复错误(vcpu-0)解决方法
  20. beam Selection

热门文章

  1. 盘点安卓手机被吐槽最多的三大奇葩设计
  2. 汽车故障诊断方法及注意事项
  3. 工程力学(18)—压杆稳定
  4. 金融危机下窗帘选购秘籍
  5. Centos下查看和修改网卡Mac地址
  6. java-net-php-python-jsp固定资产管理系统计算机毕业设计程序
  7. opencv实训记录(大家来找茬辅助外挂)
  8. 卸载过 IE浏览器,再安装提示“安装程序无法继续,因为你的计算机上安装了新的 Internet Explorer” ,cv 别人的IE浏览器安装文件夹打开 iexplore.exe 窗口闪一下又关掉了
  9. 【杂学笔记-表观遗传学-updating】
  10. 解决“桌面右键单击文件夹鼠标一直转圈”