文章目录
- 前言
- 一、脚本结构图及编写思路讲解
- 二、各模块功能介绍
-
- [2.1 CPU监测并获取数据模块](#2.1 CPU监测并获取数据模块)
- [2.2 内存、硬盘监测并获取数据模块](#2.2 内存、硬盘监测并获取数据模块)
- [2.3 I/O await监测并获取数据模块](#2.3 I/O await监测并获取数据模块)
- [2.4 网络流量监控](#2.4 网络流量监控)
- [2.5 邮件告警模块](#2.5 邮件告警模块)
- [2.6 参数配置模块](#2.6 参数配置模块)
- 三、脚本整合
- 四、选择合适的脚本使用方式
- 五、虚拟机环境进行脚本验证测试
- 总结
前言
在当今的IT运维环境中,Linux服务器作为核心基础设施,其稳定性和性能直接影响业务连续性。随着业务规模扩大,人工监控服务器资源(如CPU、内存、磁盘、网络等)变得低效且不可靠。自动化监控与报警脚本成为运维团队的重要工具,能够实时捕获异常并快速响应,避免潜在的服务中断或性能瓶颈。
一、脚本结构图及编写思路讲解
这是一个模块化的自动化资源监控告警脚本,目的是为了自动化监测服务器的CPU使用率、内存使用率、硬盘使用率、硬盘I/O延迟、实时带宽这些数据是否到达设定阈值,并进行日志记录以及到达阈值时的邮箱报警。具体各模块的作用如下图所示:
脚本的编写思路为:
- 从系统底层的数据中获取需要的实时数据
- 处理获得到的底层数据
- 比较设定阈值和处理后的数据
- 将处理后的数据进行日志记录 ,并根据比较结果判断是否要进行邮件告警
二、各模块功能介绍
2.1 CPU监测并获取数据模块
通过从/proc/stat
文件中获取系统启动开始累计的CPU的空闲总时间 idle
,再将其中的user
、nice
、system
、idle
、iowait
、irq
、softirq
、steal
、guest
、guest_nice
这些在CPU的各环节使用的总时间相加获得CPU使用总时间。通过在中间加一个短暂的延迟,两次获取到这两个数值并作差,使用以下公式可以得出这段时间内的CPU利用率:
实时CPU利用率 = (当前空闲总时间 - 前一次空闲总时间)/ (当前CPU总时间 - 前一次CPU总时间) x 100%

2.2 内存、硬盘监测并获取数据模块
内存和硬盘的计算方法基本相同,内存可以通过从/proc/meminfo
获取可用内存和完整内存,通过以下公式得出内存利用率:
内存利用率 = (完整内存 - 可用内存)/ 完整内存 x 100%
即:内存利用率 = 已用内存 / 完整内存 x 100%
硬盘则是利用了df
命令,df /
可以获得挂载在根目录下的硬盘sda的已用硬盘量和完整硬盘量,并用以下公式的出磁盘利用率:
磁盘利用率 = 已用磁盘量 / 完整磁盘量 x 100%
2.3 I/O await监测并获取数据模块
硬盘的I/O await这个数据代表了硬盘I/O的延迟当硬盘I/O延迟过大时,会造成业务数据获取与存储的卡顿,影响用户体验。通过iostat
可以获得硬盘的I/O await数据,但要注意的是直接使用iostat获取的是累积的数值,所以需要使用iostat -x 1 2
并去除显示的累积值来获取实时的I/O await。
2.4 网络流量监控
在计算网络流量的下载上传数据前必须得知道,宽带带宽使用的单位为Mbps、Kbps计算的是每秒流通的比特数,而日常生活中使用的MB/s
、KB/s
为每秒流通的字节数,中间的转换公式为:
bps = B/s × 8
因此当想要将计算得来的字节每秒转换为比特每秒需要先乘以8,于是当我们从/proc/net/dev中获取到累积的入站流量累积RX1和出站流量累积TX1后,进行INTERVAL
时间的等待后,再次获取新的两个累积值RX2、TX2之后,使用以下公式可以的出入站实时流量的数据(以B/s作为单位):
入站流量(B/s)=(RX2-RX1) / INTERVAL
出站流量(B/s)=(TX2-TX1) / INTERVAL
同时因为存在多个单位的原因,MB/s
、KB/s
、B/s
,可以写一个单位间的转换函数,帮助我们更好地进行单位间的转换,增强可读性。
2.5 邮件告警模块
实现重复化的判断以及告警功能,如CPU、内存、硬盘、I/O await这几个数据间的判断及判断后的操作基本相同,都是使用获取到的值和设定的阈值进行比较,然后进日志记录和邮件告警,所以这些环节可以编写为一个函数方便进行复用。而网络流量的监控因为要求数据的准确性,进行了多次取值计算平均值以及判断多次取值中到达阈值的判断,因此需要单独配置。
邮件告警可以使用

2.6 参数配置模块
将脚本中的一些人为设定的参数提取到一个文件方便调整,或将一些脚本中常出现的值、路径等放入此处,减少输入长文本的操作,加快脚本的编写速度。
三、脚本整合
模块全部编写完成后,将模块导入主程序文件,再整合逻辑进行判断达成最终效果
四、选择合适的脚本使用方式
根据监控频率的需求进行脚本文件开启方式的选择。
特性 | 定时任务 (cron) | while true 循环(使用sleep进行时间控制) |
---|---|---|
最小间隔 | 1分钟 | 任意秒数 |
资源占用 | 低 | 高(常驻内存) |
可靠性 | 高(系统管理) | 低(需自行监控) |
状态保持(变量复用) | 无 | 有 |
适合场景 | 定期任务 | 实时监控 |
日志管理 | 系统自动 | 需要自定义 |
一般只有在秒级监控、实时监控或变量需要复用时才会使用while true
五、虚拟机环境进行脚本验证测试
内存、硬盘使用dd
进行测试。
bash
#使用dd往内存中直接放文件去填充内存,接着测试
dd if=/dev/zero of=/dev/shm/fill_memory bs=2M count=1024 status=progress
I/O await可以使用fio
命令模拟。
网络出入站流量使用iperf3
测试工具,测试机器作为服务器使用iperf3 -s
,另一台主机作为客户端使用iperf3 -c <服务器IP> -t <时间>
测试入站流量,加上-R
测试出站流量。
CPU使用stress -c 4 -t 60s
测试。
总结
别再被复杂的脚本吓倒了!当你掌握了正确的思路,脚本编写就像打游戏一样简单刺激------每个功能都是你要解锁的成就,每行代码都是你击败的怪物!
💪 记住这三大核心秘诀:
1. 化繁为简的魔法
再复杂的脚本都是由一个个小模块组成的!就像搭乐高一样------先造小块,再拼成大作。CPU监控、内存检查、邮件告警...逐个击破,你就是脚本界的建筑师!
2. 实践出真知的真理
看十遍不如写一遍!写废了?恭喜你!每个bug都是你升级的经验值。今天可能还在纠结语法,明天就能写出自动化监控系统------进步就在一次次尝试中爆发!
3. 举一反三的智慧
同一个监控思路,稍作修改就能用在CPU、内存、磁盘上!这就是脚本的威力------掌握一个套路,吊打多个场景。你会突然发现:原来我这么牛逼?!
🔥 现在就开始你的逆袭:
- 立刻动手写你的第一个监控脚本,哪怕只是打印"Hello World"
- 今天就部署一个真正的服务器监控,感受自动化带来的成就感
- 明天就优化,让你的脚本更智能、更强大
别再怀疑自己了! 每个脚本大神都是从"小白"开始的。你写的每一行代码,解决的每一个问题,都在让你离"大神"更近一步!
💻 现在就打开终端,开始你的脚本征服之路吧! 🚀🚀🚀