使用python进行服务器监控

Linux服务器中,一切皆为文件。也就是说服务器运行的各种信息,其实是可以从某些文件中查询得到;

Linux系统中,有一个/proc的虚拟文件系统

Linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc 虚拟文件系统实现的。/proc 文件虚拟系统是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做“/proc”),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(on the fly)改变设置(通过改变内核参数)。与其他文件系统不同,/proc 存在于内存而不是硬盘中。proc 文件系统提供的信息如下:

1.进程信息:系统中的任何一个进程,在proc的子目录中都有一个同名的进程ID,可以找到cmdline、mem、root、stat、statm以及status。某些信息只有超级用户可见,例如进程根目录。每一个单独含有现有进程信息的进程有一些可用的专门链接,系统中的任何一个进程都有一个单独的自链接指向进程信息,其用处就是从进程中获取命令行信息。

2.系统信息:如果需要了解整个系统信息中也可以从/proc/stat 中获得,其中包括 CPU 占用情况、磁盘空间、内存对换、中断等

3.CPU 信息:利用/proc/CPUinfo 文件可以获得中央处理器的当前准确信息

4.负载信息:/proc/loadavg 文件包含系统负载信息

5.系统内存信息:/proc/meminfo 文件包含系统内存的详细信息,其中显示物理内存的数量、可用交换空间的数量,以及空闲内存的数量等

/proc 目录中的主要文件的说明

以上列出来了这么多,是不是看起来眼花缭乱,但是不要慌,其实我们进行服务器监控,只会经常用到其中比较少的以部门。

利用/proc文件系统进行服务器监控

以上我们知道了服务器信息可以从哪里获取,那么下面,我们就是编写脚本,读取我们要获取信息的文件,从中得到服务器的运行数据。下面是我们经常会需要监控的服务器的一些数据:

读取/proc/meminfo获取内存信息

该文件内容如下

MemTotal: 1017544kB

MemFree:583304kB

MemAvailable:756636kB

Buffers:42996kB

Cached:238820kB

SwapCached: 0 kB

Active:116092kB

Inactive:252004kB

Active(anon):11956kB

Inactive(anon):85136kB

Active(file):104136kB

Inactive(file):166868kB

Unevictable: 0 kB

Mlocked: 0 kB

SwapTotal:1044476kB

SwapFree:1044272kB

Dirty:64kB

Writeback: 0 kB

AnonPages:86304kB

Mapped:48832kB

Shmem:10812kB

Slab:40648kB

SReclaimable:29904kB

SUnreclaim:10744kB

KernelStack:2048kB

PageTables:8232kB

NFS_Unstable: 0 kB

Bounce: 0 kB

WritebackTmp: 0 kB

CommitLimit:1553248kB

Committed_AS:681428kB

VmallocTotal:34359738367kB

VmallocUsed:5796kB

VmallocChunk:34359727572kB

HardwareCorrupted: 0 kB

AnonHugePages:32768kB

HugePages_Total: 0

HugePages_Free: 0

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize:2048kB

DirectMap4k:34752kB

DirectMap2M:1013760 kB

监控代码:

"""内存监控"""

defmemory_stat():

mem={}

f= open('/proc/meminfo', 'r')

lines=f.readlines()

f.close()for line inlines:if len(line) < 2:continuename= line.split(':')[0]

var= line.split(':')[1].split()[0]

mem[name]=float(var)

mem['MemUsed'] = mem['MemTotal'] - mem['MemFree'] - mem['Buffers'] - mem['Cached']#记录内存使用率 已使用 总内存和缓存大小

res ={}

res['percent'] = int(round(mem['MemUsed'] / mem['MemTotal'] * 100))

res['used'] = round(mem['MemUsed'] / (1024 * 1024), 2)

res['MemTotal'] = round(mem['MemTotal'] / (1024 * 1024), 2)

res['Buffers'] = round(mem['Buffers'] / (1024 * 1024), 2)return res

读取/proc/loadavg获取CPU负载信息

该文件内容如下:

0.00 0.01 0.05 1/128 9424 简单说明一下每个字段的含义,前三个参数分别为1、5、15分钟内cpu的平均负载,第四个参数为正在运行的进程数和总进程数,最后一个代表最近活跃的进程ID

下面为python实现的监控CPU负载的代码:

"""CPU负载监控"""

defload_stat():

loadavg={}

f= 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]

prosess_list= loadavg['nr'].split('/')

loadavg['running_prosess']=prosess_list[0]

loadavg['total_prosess']=prosess_list[1]

loadavg['last_pid']=con[4]return loadavg

利用python的os包获取硬盘信息

importos'''os.statvfs方法用于返回包含文件描述符fd的文件的文件系统的信息。

语法:os.statvfs([path])

返回值

f_bsize: 文件系统块大小

f_frsize: 分栈大小

f_blocks: 文件系统数据块总数

f_bfree: 可用块数

f_bavail:非超级用户可获取的块数

f_files: 文件结点总数

f_ffree: 可用文件结点数

f_favail: 非超级用户的可用文件结点数

f_fsid: 文件系统标识 ID

f_flag: 挂载标记

f_namemax: 最大文件长度'''

defdisk_stat():

hd={}

disk= os.statvfs('/')

hd['available'] = float(disk.f_bsize *disk.f_bavail)

hd['capacity'] = float(disk.f_bsize *disk.f_blocks)

hd['used'] = float((disk.f_blocks - disk.f_bfree) *disk.f_frsize)

res={}

res['used'] = round(hd['used'] / (1024 * 1024 * 1024), 2)

res['capacity'] = round(hd['capacity'] / (1024 * 1024 * 1024), 2)

res['available'] = res['capacity'] - res['used']

res['percent'] = int(round(float(res['used']) / res['capacity'] * 100))return res

获取服务器的ip

在一个服务器上,可能有多块网卡, 在获取网卡信息时,你需要传入网卡的名字,具体有哪些网卡,可以使用ifconfig命令查看

"""获取当前服务器ip"""

defget_ip(ifname):importsocketimportfcntlimportstruct

s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))[20:24])

读取/proc/net/dev获取网卡流量信息

我们将会从该文件中获得系统的网络接口,以及当系统重启之后通过它们数据发送和接受数据的信息。 /proc/net/dev文件让这些信息可用。如果你检查了这个文件的内容,你就会注意到头一两行包含了头信息等等,这个文件第一列是网络接口名,第二和第三列显示了接收和发送的字节数信息(例如总发送字节数,包数,错误等等)。这里我们所感兴趣的就是他哦难过不同的网络设备提取出总发送数据和接收数据。下面的代码展示了怎么从/proc/net/dev文件中提取出这些信息,文件内容会是这样的:

下面将获取每个网卡的进出流量信息:

#!/usr/bin/env python

from __future__ importprint_functiondefnet_stat():

net={}

f= open("/proc/net/dev")

lines=f.readlines()

f.closefor line in lines[2:]:

line= line.split(":")

eth_name=line[0].strip()if eth_name != 'lo':

net_io={}

net_io['receive'] = round(float(line[1].split()[0]) / (1024.0 * 1024.0),2)

net_io['transmit'] = round(float(line[1].split()[8]) / (1024.0 * 1024.0),2)

net[eth_name]=net_ioreturnnetif __name__ == '__main__':

netdevs=net_stat()print(netdevs)

最后在提供一个Apache服务的监控脚本

#!/usr/bin/env Python

importos, sys, timewhileTrue:

time.sleep(4)try:

ret= os.popen('ps -C apache -o pid,cmd').readlines()if len(ret) < 2:print "apache 进程异常退出, 4 秒后重新启动"time.sleep(3)

os.system("service apache2 restart")except:print "Error", sys.exc_info()[1]

python实现网络监控_使用python进行服务器监控相关推荐

  1. python简单网络爬虫_【Python】简单的网络爬虫

    完整代码 # encoding:UTF-8 # from bs4 import BeautifulSoup import urlparse import urllib2 import re impor ...

  2. python控制网络摄像头_用Python控制摄像头拍照并发邮件

    码农那点事儿 关注我们,一起学习进步 00 概述 前言 工具 思路 安装及导入包 设置参数 实现拍照 构造邮件内容 发送邮件 判断网络连接 开机自启 后记 o1 前言 为什么会有写这个程序的想法呢? ...

  3. python读取网络摄像头_使用Python/Linux读取网络摄像头的选项

    我正在寻找一种方法,将网络摄像头集成到我的python程序中. 我运行的是Raspberry Pi型号,频率为900mHz,因此解决方案需要与ARM兼容,并且(希望)轻量级. 我看到的大多数帖子都推荐 ...

  4. python简单网络爬虫_【Python】 简单网络爬虫实现

    介绍网络爬虫(英语:网络爬虫),也称为网络蜘蛛(蜘蛛)是一个Web机器人用于自动浏览万维网.其目的通常是为了编译web索引.\u2014\u2014维基百科web爬虫程序可以节省他们访问的页面,以便搜 ...

  5. python简历数据提取_提取python简介

    书籍:掌握Python的网络和安全 Mastering Python for Networking and Security - 2018.pdf 简介 掌握Python的网络和安全 掌握Python ...

  6. python系统监控_使用Python监控Linux系统

    阅读目录 一.Python编写的监控工具 一.多功能系统资源统计工具dstat 1.dstat介绍 dstat是一个用Python语言实现的多功能系统资源统计工具,用来取代Linux下的vmstat. ...

  7. python做服务器监控_使用python进行服务器的监控

    在Linux服务器中,一切皆为文件,就是说,服务器运行的个中信息,其实是可以从某些文件中查询得到的:百度后,你会知道,在Linux系统中,有一个/proc的虚拟文件系统: Linux 系统为管理员提供 ...

  8. 简书python自动化运维_简明Python开发教程(4):网络自动化运维的曙光

    写在前面 本打算自动登陆一台路由器,执行查询配置指令,然后用正则表达式分析,获取该路由器的接口连接关系. 现在由于网络问题,导致无法直接telnet路由器,只能通过其他方式获取配置文件,如读取本地文件 ...

  9. 用python爬虫下载视频_使用Python编写简单网络爬虫抓取视频下载资源

    我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎,所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了! 回到用Python写爬虫的话题. Python一直是我主要使用的脚 ...

最新文章

  1. springMVC 使用WebApplicationContext获取ApplicationContext对象
  2. python输出数据到excel-Python从数据库导出数据到Excel
  3. LogStash 中字段的排除和数据的排除
  4. 计算机控制读书报告心得,计算机控制系统读书报告
  5. SpringCloud Ribbon(二)之自定义负载均衡策略IRule
  6. Linux笔记-iptables模拟公司环境配置
  7. 《go程序设计语言》读书笔记
  8. RabbitMQ的三大交换器详解
  9. iOS疑难问题排查之深入探究dispatch_group crash
  10. TypeScript学习(六):函数的定义及特性
  11. python库-密码学库pynacl
  12. matlab动力学系统仿真 教程,MATLAB/SIMULINK动力学系统建模与仿真
  13. TransCoder介绍
  14. pandas 按列 tolist
  15. 【渝粤教育】电大中专中药学基础 (2)作业 题库
  16. 2012年股市楼市泡沫终将破灭
  17. 喜忧参半的电子烟 究竟是不是一个靠谱的创业机会?
  18. 如何逃出【 AI 换脸的世界】
  19. 【饭谈】面试场上的珍珑棋局(PUA之无限打击)
  20. css实现鼠标悬停效果

热门文章

  1. 在阿里当PM都需要做什么?
  2. 为什么顶尖高手,都是长期主义者?
  3. 手把手教你搭建 ELK 实时日志分析平台
  4. 简历这样写,技术人都不直男了!
  5. 网易MySQL中间件的负载均衡策略及性能优化
  6. 深入分析Spark任务调度的原理--Java后端同学入门Spark编程系列
  7. 有人说:穷学IT富搞金融!程序员究竟是不是一帮苦孩子在做?
  8. 微软某员工后悔跳槽阿里:工资才多20万不到,天天加班快崩溃!
  9. 基于深度学习的肺癌预测诊断
  10. 私藏的7个实用工具,干货多到爆炸!