监控 Linux 服务器资源

使用 Bash 脚本监控 Linux 服务器资源并发送告警邮件

  • 前言
  • [一、🛠️ 脚本功能概览](#一、🛠️ 脚本功能概览)
  • [二、 📜 脚本核心逻辑分解](#二、 📜 脚本核心逻辑分解)
        • [2.1. 变量初始化](#2.1. 变量初始化)
        • [2.2. CPU 使用率监控](#2.2. CPU 使用率监控)
        • [2.3. 内存使用率监控](#2.3. 内存使用率监控)
        • [2.4. 磁盘使用率监控](#2.4. 磁盘使用率监控)
        • [2.5. 磁盘 IO 延迟监控(await)](#2.5. 磁盘 IO 延迟监控(await))
        • [2.6. 网络流量监控](#2.6. 网络流量监控)
    • 在这里插入图片描述
  • [三、📤 告警通知机制](#三、📤 告警通知机制)
  • [四、📁 日志文件说明](#四、📁 日志文件说明)
  • [五、✅ 使用建议](#五、✅ 使用建议)
        • [5.1. 配置定时任务(Cron)](#5.1. 配置定时任务(Cron))
        • [5.2. 邮件发送配置](#5.2. 邮件发送配置)
        • [5.3. 安全性建议](#5.3. 安全性建议)
        • [5.4. 扩展功能建议](#5.4. 扩展功能建议)
  • [六、🧩 总结](#六、🧩 总结)

前言

在现代 IT 运维中,及时掌握服务器的运行状态至关重要。当 CPU、内存、磁盘、IO 或网络等关键指标出现异常时,快速告警能够帮助运维人员第一时间响应,避免服务中断或性能下降。

本文将介绍一个用 Bash 脚本编写的轻量级服务器资源监控工具,它能够实时检测以下指标:

  • CPU 使用率
  • 内存使用率
  • 磁盘使用率
  • 磁盘 IO 延迟(await)
  • 网络流量(接收/发送速率)
    当任意一项指标超过设定的阈值时,脚本将通过 邮件 发送告警信息,同时在本地日志文件中记录状态,便于后续排查与审计。

一、🛠️ 脚本功能概览

监控项 指标说明 阈值参数 告警方式
CPU CPU 使用率百分比 CPUMAX=80% 邮件 + 本地日志
内存 内存使用率百分比 MEMMAX=80% 邮件 + 本地日志
磁盘 根分区使用率百分比 DISK_MAX=80% 邮件 + 本地日志
IO(磁盘) IO await(读/写) THRES_AWAIT=50ms 邮件 + 本地日志
网络 接收/发送流量(MB/s) NETWORK=10MB/s 邮件 + 本地日志

二、 📜 脚本核心逻辑分解

2.1. 变量初始化

脚本开头定义了日志路径、邮箱配置、SMTP 信息以及各项监控阈值:

bash 复制代码
#日志
LOG_CPU="/var/log/cpu.log"
LOG_MEM="/var/log/mem.log"
LOG_DISK="/var/log/disk.log"
LOG_IO="/var/log/io_await.log"
LOG_NET="/var/log/net.log"
#邮箱
EMAIL="you_mail@.com"
SMTP_HOST="smtp.163.com"
SMTP_PORT=465
SMTP_USER="you_mail@.com"
SMTP_PASS="授权码"
#告警阈值
CPUMAX=80
MEMMAX=80
DISK_MAX=80
THRES_AWAIT=50
NETWORK=10

📌 注意:脚本使用了 mail 命令发送邮件,背后需配置好如 ssmtpsendmail 或者通过 mutt 等工具结合 SMTP 服务发送。默认 mail 命令可能无法直接使用,需要额外配置。

2.2. CPU 使用率监控

通过 top 命令提取 CPU 空闲率,再计算使用率,并与阈值比较:

bash 复制代码
CPU=$(top -bn1|grep "Cpu(s)"|awk '{print $2}')
if (( $(echo "$CPU > $CPUMAX" | bc -l))); then
     CPU_ALERT="CPU使用率: ${CPU}%(超过${CPUMAX}%)${TIME}"
else
     CPU_ALERT=""
     echo "${TIME} :OK"   >> /var/log/cpu.log
fi
2.3. 内存使用率监控

通过 free 命令获取已用和总内存,计算使用率:

bash 复制代码
MEM_USE=$(free | awk '/Mem:/ {print $3}')
MEM_TOTAL=$(free |awk '/Mem:/ {print $2}')
MEM_USAGE=$(echo "scale=2; $MEM_USE * 100/ $MEM_TOTAL "| bc)

同样与 MEMMAX 比较,超过则告警。

2.4. 磁盘使用率监控

使用 df -h / 获取根分区使用百分比,去掉 % 后与 DISK_MAX 比较:

bash 复制代码
DISK_INFO=$(df -h / | grep / | awk '{print $5}'|sed 's/%//g')
2.5. 磁盘 IO 延迟监控(await)

使用 iostat -x 1 2 获取磁盘 sda 的读写 await 值(第 10 和 11 列),判断是否超过 50ms:

bash 复制代码
IO_AWAIT_R=$(iostat -x 1 2|grep sda|tail -1 |awk '{print $10}')
IO_AWAIT_W=$(iostat -x 1 2|grep sda|tail -1 |awk '{print $11}')

🧠 小知识:await 表示每次 IO 请求的平均等待时间(单位:毫秒),数值过高可能意味着磁盘存在性能瓶颈。

2.6. 网络流量监控

通过 /proc/net/dev 获取指定网卡(默认第一个非 lo 网卡)的接收(RX)和发送(TX)字节数,转换为 MB/s,与 NETWORK 阈值(10MB/s)对比:

bash 复制代码
NIC=$(ifconfig | grep -B1 "inet" | grep -v 'lo' |head -n1 |awk '{print $1}'|sed 's/://g')
RX_BYTES=$(grep "$NIC" /proc/net/dev |awk '{print $2}')
TX_BYTES=$(grep "$NIC" /proc/net/dev |awk '{print $10}')

⚠️ 注意:该网络监控逻辑是瞬时流量 ,如果要监控带宽速率(比如每秒流量),需要两次采样做差值计算,这里简化处理,仅作参考。

三、📤 告警通知机制

当任一监控项超过阈值时,脚本会:

  1. 拼接告警信息,包括时间与具体异常项;

  2. 通过 mail 命令发送邮件给指定邮箱;

  3. 将状态写入对应的日志文件(如 /var/log/cpu.log)。
    示例告警邮件内容:

    告警时间: 2025-09-07 20:12:36
    【CPU】CPU使用率: 85.6%(超过80%)2025-09-07 20:12:36
    【硬盘】硬盘使用率: 87%(超过80%)2025-09-07 20:12:36


四、📁 日志文件说明

脚本会在 /var/log/ 目录下生成如下日志,用于记录每次检测的结果,便于后续分析:

  • cpu.log:CPU 告警或正常信息
  • mem.log:内存告警或正常信息
  • disk.log:磁盘使用率告警或正常信息
  • io_await.log:IO await 告警信息
  • net.log:网络流量告警信息
    每个日志文件在检测正常时都会追加一行 :OK,方便做定时任务监控和统计。

五、✅ 使用建议

5.1. 配置定时任务(Cron)

可以将此脚本保存为 /usr/local/bin/server_monitor.sh,然后添加到 crontab 中,例如每分钟执行一次:

bash 复制代码
* * * * * /bin/bash /usr/local/bin/server_monitor.sh
5.2. 邮件发送配置

脚本中使用的是 mail 命令发送邮件,但要使其真正可用,通常需要:

  • 安装并配置 mailxmutt 或者 ssmtp
  • 或者使用 curl 调用第三方邮件 API(如阿里云邮件推送、SendGrid 等)
    推荐使用 mutt 或配置好 sendmail 与 SMTP 服务对接。
5.3. 安全性建议
  • 不要将邮箱密码明文写在脚本中,建议使用环境变量或配置文件(并限制权限)

  • 脚本中涉及敏感信息(如 SMTP_PASS),建议设置文件权限为仅 root 可读:

    bash 复制代码
    chmod 700 /usr/local/bin/server_monitor.sh
    chmod 600 /var/log/*.log
5.4. 扩展功能建议
  • 增加更多网卡支持或多维度网络流量统计
  • 增加进程级别的监控(如 MySQL、Nginx 是否在运行)
  • 使用更专业的监控工具集成,如 Prometheus + Grafana,但本脚本胜在轻量和易部署

六、🧩 总结

通过上述 Bash 脚本,我们可以快速搭建一套轻量级的服务器基础资源监控和告警系统。虽然不如专业监控软件功能全面,但对于小型环境、个人服务器或临时监控需求,它简单、有效、即插即用。

适用场景:

  • 个人 VPS 监控
  • 小公司内网服务器巡检
  • 临时排查性能问题
  • 学习 Linux 系统监控的入门实践

技术栈:

  • Bash 脚本
  • Linux 命令(top, free, df, iostat, ifconfig, awk, bc)
  • 邮件发送(mail / mutt / SMTP)
  • Crontab 定时任务

💡 提示: 如果你首次使用 iostat,可能需要安装 sysstat 包:

bash 复制代码
sudo apt install sysstat   # Debian / Ubuntu
sudo yum install sysstat   # CentOS / RHEL
相关推荐
tongsound5 小时前
ros2 lifcycle介绍
linux·c++
☆璇5 小时前
【Linux】Linux环境基础开发工具使用
linux·运维·服务器
鹿鸣天涯5 小时前
CentOS系统停服,系统迁移Ubuntu LTS
linux·运维·centos
半桔5 小时前
【Linux手册】管道通信:从内核底层原理到使用方法
java·linux·服务器·网络·c++
weixin_456904276 小时前
CentOS与Ubuntu的详细区别
linux·ubuntu·centos
zfxwasaboy6 小时前
linux Kbuild详解关于fixdep、Q、quiet、escsq
android·linux·ubuntu
十五年专注C++开发6 小时前
cargs: 一个轻量级跨平台命令行参数解析库
linux·c++·windows·跨平台·命令行参数解析
三坛海会大神5557 小时前
Linux服务器资源自动监控与报警脚本详解
linux·运维·服务器
向qian看_-_13 小时前
Linux 使用pip报错(error: externally-managed-environment )解决方案
linux·python·pip