Python监控Linux系统(1)

使用Python监控Linux系统

Linux下有许多使用Python语言编写的监控工具,如inotify-sync, dstat和glances. 此外,如果要根据业务编写简单的监控脚本,很多工程师也会选择Python语言。Python语言是一门简单 易学/语法清晰/表达能力强的编程语言,非常适合于编写监控程序的场景。使用Python语言编写监控程序具有以下几个优势:

  • Python语言开发效率高。 Python语言有自 己的优势与劣势,使用Python开发监控程序是一个充分发挥Python优势,避免Python劣势的领域。对于监控程序来说,能够利用Python语言开发效率高的优势尽快完成程序的编写工作。同时,监控程序也不要求性能,因此避免了Python语言性能不如C、C++和Java的劣势。
  • Python语言表达能力强。相信任何-个学习Linux的工程师都使用过shel脚本编写过监控程序。虽然Linux下有很多监控工具,也有很多文本处理程序,但是获取监控与解析结果是完全不同的工具。解析监控结果的程序不理解监控程序输出结果的具体含义。Python语言中有非常丰富的数据结构,可以用各种方式保存监控结果,以便后续处理。
  • 利用第三方库开发监控程序。Python的标准库本身非常强大,被称为”连电池都包含在内”。对于-个问题,如果标准库没有提供相应的工具,那么也会有开源的项目来填补这个空白。监控程序正式这样一种情况, 在Python语言中,具有非常成熟的第三方库帮助开发者简化监控程序的编写工作。

一、Python编写的监控工具

我们将介绍两个Python语言编写的监控工具,分别是dstat和glances。

1、多功能系统资源统计工具dstat

dstat是一个用Python语言实现的多功能系统资源统计工具,用来取代Linux下的vmstat、iostat、netstat和ifstat等命令。并且,dstat克服了这些命令的限制,增加了额外的功能、以及更多的计数器与更好的灵活性。dstat可以在一个界面上展示非常全面的监控信息,因此,在系统监控、基准测试和故障排除等应用场景下特别有用。

我们可以使用dstat监控所有系统资源的使用情况,并且可以结合不同的场景定制监控的资源。例如,在同一时间段以相同的时间频率比较网络带宽与磁盘的吞吐率。

dstat将以列表的形式显示监控信息,并且用不同的颜色进行输出,以可读性较强的单位展示监控数值。例如,对于字节数值,dstat自动根据数值的大小,以K、M、G等单位进行显示,避免了开发者使用其他命令时因为数值太大造成的困惑和错误。此外,使用dstat还可以非常方便地编写插件用来收集默认情况下没有收集的监控信息。dstat是专门为人们实时查看监控信息设计的,因此,默认将监控结果输出到屏幕终端。我们也可以将监控信息以CSV格式输出到文件,以便后续处理。

2、dstat介绍

作为一个多功能系统资源统计工具, dstat具有以下特性:

  • 结合了 vmstat, iostat, ifstat, netstat 等监控工具的功能,并且提供了更多的监控信息;
  • 实时显示监控数据;
  • 在问题分析和故障排查时,可以监视最重要的计数器,也可以对计数器进行排序;
  • 模块化设计;
  • 使用 Python 语言编写,更方便扩展现有的工作任务;
  • 容易扩展,便于添加自定义的计数器;
  • 包含的许多扩展插件充分说明了增加新的监控项目是很方便的;
  • 可以分组统计块设备/网络设备,并给出、汇总信息;
  • 可以显示每台设备中断信息;
  • 非常准确的时间精度,即便是系统负荷较高也不会延迟显示;
  • 准确显示单位,限制转换误差范围;
  • 用不同的颜色显示不同的单位,增加可读性;
  • 显示中间结果延时小于1秒
  • 支持 csv 格式输出,便于将监控信息导人 Gnumeric 和 Excel 以生成图形。

3、安装使用

如果操作系统默认没有安装dstat.那么需要我们手动进行安装。如下所示:

[root@python ~]# yum -y install dstat

<1>dstat命令的–version选项,除了显示出tat的版本以外,还会显示操作系统的版本、Python语言的版本、cpu的个数,以及dstat支持的插件列表等详细信息。如下所示:

[root@python ~]# dstat --version

《Python监控Linux系统(1)<dstat,glances,shell,dos2unix>》” /></p><p><strong><2>dstat –list获取dstat的插件列表</strong></p><pre><code>dstat --list</code></pre><p><img layer-src=web访问如下图:

《Python监控Linux系统(1)<dstat,glances,shell,dos2unix>》” /></p><h1>三、Python监控Linux</h1><p><strong>shell查看磁盘的监控信息,如下所示:</strong></p><pre><code>[root@python proc]# cat /proc/diskstats 
   8       0 sda 85935 21845 10913707 101067 3119 81257 743486 15647 0 31410 109079
   8       1 sda1 1822 0 12456 397 4 0 4096 74 0 457 462
   8       2 sda2 84082 21845 10897907 100659 3115 81257 739390 15573 0 30950 108604
  11       0 sr0 0 0 0 0 0 0 0 0 0 0 0
 253       0 dm-0 80726 0 10688467 99971 2275 0 82606 10224 0 27927 110196
 253       1 dm-1 25123 0 205184 7367 82098 0 656784 616558 0 5167 623924</code></pre><h2>1、使用shell脚本监控</h2><h3>(1)安装转换工具</h3><p><strong>dos2unix 和 unix2dos 命令将纯文本文件从 DOS 或 Mac 格式转换为 Unix,反之亦然。</strong></p><pre><code>[root@python scripts]# yum -y install dos2unix
//下载dos2unix</code></pre><h3>(2)编写shell脚本</h3><pre><code>[root@python scripts]# vim monitor.sh
#/bin/sh
cpu_idle=$(top -n2 | grep 'Cpu' | tail -n 1 | awk '{print $8}')
cpu_usage=$(printf

(3)转换并执行

[root@python scripts]# dos2unix monitor.sh
//转换为格式为Unix
[root@python scripts]# cat monitor.sh
#/bin/sh
cpu_idle=$(top -n2 | grep 'Cpu' | tail -n 1 | awk '{print $8}')
cpu_usage=$(printf "%.2f" `echo "scale=2; 100 - $cpu_idle" | bc`)
mem_free=$(free -m | awk '/Mem:/{print $4 + $6 +$7}')
mem_total=$(free -m | awk '/Mem:/{print $2}')
mem_used=$(echo "$mem_total - $mem_free" | bc)
mem_rate=$(echo "$mem_used * 100 / $mem_total" | bc)
disk_usage=$(df -h / | tail -n 1 | awk '{print $5}')
disk_used=$(df -h / | tail -n 1 | awk '{print $3}')
echo "CPU利用率:$cpu_usage %"
echo "内存使用量: $mem_used M"
echo "内存利用率:$mem_rate %"
echo "磁盘空间使用量:$disk_used"
echo "磁盘空间利用率:$disk_usage"
[root@python scripts]# sh monitor.sh
//执行编写好的脚本

《Python监控Linux系统(1)<dstat,glances,shell,dos2unix>》” /></p><h2>2、使用python脚本监控</h2><p><strong>编写一个Python脚本,监控磁盘信息,如下所示:</strong></p><h3>(1)查看服务启动情况</h3><pre><code>[root@python scripts]# vim proc_count.py 

import os

n = 0
for item in os.listdir('/proc'):
    if item.isdigit():
        n = n+1
        # print(len(item))
print(n)</code></pre><h5>执行结果如下:</h5><pre><code>[root@python scripts]# python3 proc_count.py 
175</code></pre><h3>(2)简易版</h3><pre><code>[root@python scripts]# vim monitor_dick.py
# coding=utf-8
# !/usr/bin/python

from __future__ import print_function
from collections import namedtuple

disk = namedtuple('Disk', 'major_number minor_number device_name'
                          ' read_count read_merged_count read_sections'
                          ' time_spent_reading write_count write_merged_count'
                          ' write_sections time_spent_write io_requests'
                          ' time_spent_doing_io weighted_time_spent_dong_io')

def get_disk_info(device):
    with open('/proc/diskstats') as f:
        for line in f:
            if line.split()[2] == device:
                return disk(*(line.split()))
    raise RuntimeError('设备({0})没找到。。。'.format(device))

def main():
    disk_info = get_disk_info('sda1')

    print(disk_info)

if __name__ == '__main__':
    main()</code></pre><h4>执行脚本:</h4><pre><code>[root@python scripts]# python3 monitor_dick.py</code></pre><p><img layer-src=

执行脚本:

[root@python scripts]# python3 monitor_dick.py

《Python监控Linux系统(1)<dstat,glances,shell,dos2unix>》” /></p></div><footer class=

点赞