本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn

摘要:

  • 原文地址
  • 由于原文来自微信公众号,并且脚本都是图片,所以这里自己亲自把代码整理执行一遍

工作原理:基于/proc文件

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

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

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

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

  • 负载信息:/proc/loadavg 文件包含系统负载信息。

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

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

文件或目录名称 描述
apm 高级电源管理系统
cmdline 内核文件启动的命令行
CPUinfo 中央处理器信息
devices 可以用到的设备(块设备/字符设备)
dma 显示当前使用的DMA通道
filesystems 核心配置的文件系统
ioports 当前使用的I/O端口
interrupts 这个文件的每一行都有一个保留终端
kcore 系统物理内存映像
kmsg 核心输出的消息,被送到日志文件
mdstat 这个文件包括由MD设备驱动程序控制的RAID设备信息
loadavg 系统平均负载均衡
meminfo 存储器使用信息,包括物理内存和交换内存
modules 这个文件给出可加载的内核模块,lsmod程序显示有关模块名称
net 网络协议状态信息
partitions 系统识别的分区表
pci pci设备信息
scsi scsi设备信息
self 到查看/proc程序进程目录的符号链接
stat 包含CPU利用率,内存页、内存兑换、磁盘,全部中断,接触开关自举时间
swaps 交换分区的使用情况
uptime 给出系统自从上次自举以来的秒数,以及有多少秒处于空闲
version 这个文件只有一行内容,说明运行内核版本

Python脚本对linux服务器的监控

对于CPU的监控

获取CPU信息

  • 脚本
#!/usr/bin/env python

from __future__ import print_function
from collections import OrderedDict
import pprint def CPUinfo():
''' Return the informaton in /proc/CPUinfo
as a dictionary in the following format:
CPU_info['proc0']={...}
CPU_info['proc1']={...}
'''
CPUinfo=OrderedDict()
procinfo=OrderedDict() nprocs = 0
with open('/proc/cpuinfo') as f:
for line in f:
if not line.strip():
# end of one processor
CPUinfo['proc%s' % nprocs] = procinfo
nprocs=nprocs+1
# reset
procinfo=OrderedDict()
else:
if len(line.split(':')) == 2:
procinfo[line.split(':')[0].strip()] = line.split(':')[1].strip()
else:
procinfo[line.split(':')[0].strip()] = ''
return CPUinfo if __name__=='__main__':
CPUinfo = CPUinfo()
for processor in CPUinfo.keys():
print(CPUinfo[processor]['model name'])
  • 结果
[root@cdtest ~]# python cpu.py   

Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz

对于系统负载的监控

获取负载信息

  • 脚本
#!/usr/bin/env python

import os
def load_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]
loadavg['last_pid']=con[4]
return loadavg
print ("loadavg",load_stat()['lavg_15'])
  • 结果
[root@cdtest ~]# python cpu2.py 

('loadavg', '0.00')

对于系统内存的监控

获取内存信息

  • 脚本
#!/usr/bin/env python

from __future__ import print_function
from collections import OrderedDict def meminfo():
''' Return the information in /proc/meminfo
as a dictionary '''
meminfo=OrderedDict() with open('/proc/meminfo') as f:
for line in f:
meminfo[line.split(':')[0]] = line.split(':')[1].strip()
return meminfo if __name__=='__main__':
meminfo = meminfo()
print('Total memory:{0}'.format(meminfo['MemTotal']))
print('Free memory:{0}'.format(meminfo['MemFree']))
  • 结果
[root@cdtest ~]# python cpu3.py   

Total memory:3925652 kB
Free memory:2999584 kB

对于网络接口的监控

获取网络信息

  • 脚本
#!/usr/bin/env python

import time
import sys if len(sys.argv)>1:
INTERFACE = sys.argc[1]
else:
INTERFACE = 'eth0'
STATS = []
print ('Interface:',INTERFACE) def rx():
ifstat = open('/proc/net/dev').readlines()
for interface in ifstat:
if INTERFACE in interface:
stat = float(interface.split()[1])
STATS[0:] = [stat] def tx():
ifstat = open('/proc/net/dev').readlines()
for interface in ifstat:
if INTERFACE in interface:
stat = float(interface.split()[9])
STATS[1:] = [stat] print ('In Out')
rx()
tx() while True:
time.sleep(1)
rxstat_o = list(STATS)
rx()
tx()
Rx = float(STATS[0])
Rx_o = rxstat_o[0]
Tx = float(STATS[1])
Tx_o = rxstat_o[1]
RX_RATE = round((Rx-Rx_o)/1024/1024,3)
TX_RATE = round((Tx-Tx_o)/1024/1024,3)
print(RX_RATE,'MB ',TX_RATE,'MB ')
  • 结果
[root@cdtest ~]# python cpu4.py 

('Interface:', 'eth0')
In Out
(0.0, 'MB ', 0.0, 'MB ')
(0.0, 'MB ', 0.0, 'MB ')
(0.0, 'MB ', 0.0, 'MB ')
(0.0, 'MB ', 0.0, 'MB ')
(0.0, 'MB ', 0.0, 'MB ')
(0.0, 'MB ', 0.0, 'MB ')
(0.0, 'MB ', 0.0, 'MB ')
(0.0, 'MB ', 0.0, 'MB ')
(0.002, 'MB ', 0.0, 'MB ')
(0.0, 'MB ', 0.0, 'MB ')
(0.0, 'MB ', 0.0, 'MB ')
(0.0, 'MB ', 0.0, 'MB ')
(0.0, 'MB ', 0.0, 'MB ')
(0.0, 'MB ', 0.0, 'MB ')

对于系统某进程的监控

获取进程信息

  • 脚本
#!/usr/bin/env python

import os,sys,time

while True:
time.sleep(4)
try:
ret = os.popen('ps -C apache -o pid,cmd').readlines()
if len(ret) < 2:
print ("apache exit,4s restart")
time.sleep(3)
os.system("service apache restart")
except:
print("error")
 
  • 结果  该结果要系统上有相应的进程才行,可以根据自己需要监控什么进程修改脚本
 

Python 脚本实现对 Linux 服务器的监控的更多相关文章

  1. 用 Python 脚本实现对 Linux 服务器的监控

    目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统 ...

  2. 用 Python 脚本实现对 Linux 服务器的网卡流量监控

    *这篇文章网上已经有相关代码,为了加深印象,我做了相关批注,希望对朋友们有帮助 工作原理:基于/proc文件系统 Linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新 ...

  3. Linux 服务器系统监控脚本 Shell【转】

    转自: Linux 服务器系统监控脚本 Shell - 今日头条(www.toutiao.com)http://www.toutiao.com/i6373134402163048961/ 本程序在Ce ...

  4. Linux服务器上监控网络带宽的18个常用命令 zz

    Linux服务器上监控网络带宽的18个常用命令 本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量 ...

  5. Linux服务器上监控网络带宽的18个常用命令和工具

    一.如何查看CentOS的网络带宽出口 检查维护系统的时候,经常会要查看服务器的网络端口是多大的,所以需要用到Linux的一个命令. 如何查看CentOS的网络带宽出口多大?可以用下面的命令来查看. ...

  6. Linux服务器上监控网络带宽的18个常用命令nload, iftop,iptraf-ng, nethogs, vnstat. nagios,运用Ntop监控网络流量

    Linux服务器上监控网络带宽的18个常用命令 本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量 ...

  7. linux 服务器性能监控(一)

    这篇文章主要介绍一些常用的linux服务器性能监控命令,包括命令的常用参数.指标的含义以及一些交互操作. 几个问题 命令本身并不复杂,关键是你对操作系统基础知识的掌握和理解,先来看看下面几个问题: C ...

  8. Python中实现对list做减法操作介绍

    Python中实现对list做减法操作介绍 这篇文章主要介绍了Python中实现对list做减法操作介绍,需要的朋友可以参考下 问题描述:假设我有这样两个list, 一个是list1,list1 = ...

  9. Linux服务器上监控网络带宽的18个常用命令

    [51CTO精选译文]本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量分开来显示. 一些命令可以 ...

随机推荐

  1. 从CUMT校园导航出现的问题看CSS布局设计(一) CSS盒模型

    先说说做的这个校园导航系统值得一提的内容: 1. 二级菜单栏  .iframe内嵌窗口(样式设计.用hover做效果) 2. 高德地图API (自定义底图样式.弹跳点.信息窗体.线路导航) 3. DO ...

  2. VIM 自定义语法高亮配置

    VIM 没有自动支持语法高亮,自己动手搞一搞,网上查了一堆资料,终于配置成功, 记录一下,以便后期查看. 总共两步: step1 : 定义语法规则 1)需要创建一个定义语法规则的文件,这个 actio ...

  3. JavaScript总结学习一:js中构造函数与普通函数的区别

    构造函数不仅只出现在JavaScript中,它同样存在于很多主流的程序语言里,比如c++.Java.PHP等等.与这些主流程序语言一样,构造函数在js中的作业一样,也是用来创建对象时初始化对象,并且总 ...

  4. Selenium滚动条window.scrollTo和window.scrollBy

    Selenium操作滚动条有两种方法,一种就是window.scrollTo,另一种是window.scrollBy,既然两个都可以用来操作滚动条,那这两个方法有什么区别呢? 1.window.scr ...

  5. sudo 无效命令

    mac系统中由于不小心修改了/etc/sudoers下的权限为777,故而sudo命令不能使用. 解决办法 1.重新启动mac并且按command+s进入单用户界面 2.此时默认的系统状态是只读状态, ...

  6. P1345 [USACO5.4]奶牛的电信Telecowmunication

    P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮 ...

  7. 2017-07-08( bzip2 bunzip mount)

    .bz2 压缩格式  不能压缩目录 bzip2  源文件  (不保留源文件) bzip2 -k  源文件 (保留源文件) bzip2 -d  压缩文件名  (-k保留压缩文件) bunzip  压缩文 ...

  8. Java 中的变量

    变量 Java 程序的变量大体可分为成员变量和局部变量. 局部变量 形参:在方法签名中定义的局部变量,由方法调用者负责为其赋值,随方法的结束而消亡. 方法内的局部变量:在方法内定义的局部变量,必须在方 ...

  9. junit3.8的使用

    今天开始junit使用系列,第一篇梳理junit3X系列,先贴下代码来体验下. 测试源代码如下: package test.junit38test; /** * @创建作者: LinkinPark * ...

  10. 【nginx】nginx解决跨域详解

    使用场景:本地运行一个项目,但是要访问外域的api接口,存在跨域问题,解决方式有很多,但我尝试用nginx解决,搜索了网上文章后再加上尝试终于成功, 其中一些注意事项和大家分享一下. 一.window ...