当前位置: 首页 > java >正文

监控 Linux 服务器资源

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

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

前言

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

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

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

一、🛠️ 脚本功能概览

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

二、 📜 脚本核心逻辑分解

2.1. 变量初始化

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

#日志
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 空闲率,再计算使用率,并与阈值比较:

CPU=$(top -bn1|grep "Cpu(s)"|awk '{print $2}')
if (( $(echo "$CPU > $CPUMAX" | bc -l))); thenCPU_ALERT="CPU使用率: ${CPU}%(超过${CPUMAX}%)${TIME}"
elseCPU_ALERT=""echo "${TIME} :OK"   >> /var/log/cpu.log
fi

在这里插入图片描述

2.3. 内存使用率监控

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

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 比较:

DISK_INFO=$(df -h / | grep / | awk '{print $5}'|sed 's/%//g')

在这里插入图片描述

2.5. 磁盘 IO 延迟监控(await)

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

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)对比:

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 中,例如每分钟执行一次:

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

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

  • 安装并配置 mailxmutt 或者 ssmtp
  • 或者使用 curl 调用第三方邮件 API(如阿里云邮件推送、SendGrid 等)
    推荐使用 mutt 或配置好 sendmail 与 SMTP 服务对接。
5.3. 安全性建议
  • 不要将邮箱密码明文写在脚本中,建议使用环境变量或配置文件(并限制权限)
  • 脚本中涉及敏感信息(如 SMTP_PASS),建议设置文件权限为仅 root 可读:
    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 包:

sudo apt install sysstat   # Debian / Ubuntu
sudo yum install sysstat   # CentOS / RHEL
http://www.xdnf.cn/news/20588.html

相关文章:

  • 软件可靠性基本概念
  • 浏览器兼容性问题全解:CSS 前缀、Grid/Flex 布局兼容方案与跨浏览器调试技巧
  • 335章:使用Scrapy框架构建分布式爬虫
  • Spring八股文
  • AIGC(AI生成内容)
  • Promise 实现原理:手写一个符合 Promises/A+ 规范的 Promise
  • 在object-c中方法多个参数怎么接收?
  • [R2-ospf-1-area-0.0.0.0] network 23.1.1.0 0.0.0.3其中的通配符理解
  • 死信 队列
  • Redis 从入门到精通:全平台安装与性能优化配置指南
  • centos8下载mysql5.7
  • 深入理解 IP 地址:概念、分类与日常应用
  • 20250907-02:LangChain 架构和LangChain 生态系统包是什么
  • Axure: 分组柱状图1
  • 【算法--链表】109.有序链表转换二叉搜索树--通俗讲解
  • C语言数组
  • spring-ai-alibaba-deepresearch 学习(十四)——CoderNode
  • 时序数据库简介和安装
  • shell编程-案例
  • 公链分析报告 - 模块化区块链1
  • Java 中的锁
  • 【系统分析师】第10章-关键技术:系统规划与分析(核心总结)
  • Mysql数据库——第一阶段
  • 教师工具箱 (Teacher Toolbox) 发布!
  • MySQL中实施排序(sorting)及分组(grouping)操作
  • 追根索源-卷积算法:AI世界里的内卷之王
  • 关键字 const
  • 使用MQTT.fx和ESP32连接Onenet平台
  • 构建高可用二级缓存系统
  • 20250907-0101:LangChain 核心价值补充