监控 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
相关推荐
groundhappy3 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕3 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫4 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生5 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.116 小时前
linux基础IO
linux·运维·服务器
BelongPanda8 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯8 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_777998348 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器
yunwei378 小时前
eBPF 教程:检查 exec 后真正安装的可执行镜像
linux·开源
笑锝没心没肺9 小时前
yum update 报错:GPG key retrieval failed: [Errno 14] HTTPS Error 404 - Not Found
linux·运维·服务器