监控 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.pswp.cn/pingmian/95992.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随机获取数组内任意元素

Math.random() * arr.length 是 JavaScript 中常用的表达式,用于生成一个范围在 [0, arr.length) 之间的随机浮点数(包含 0,但不包含数组长度本身)。 作用说明: Math.random() 生成一个 [0, 1) 区间的随机浮点数&#…

android studio gradle 访问不了

1.通过国内镜像站 2.通过本地部署 参考这个搞定 https://blog.csdn.net/2401_82819685/article/details/144542784

科普:企业微信的第三方应用涉及的“配置应用权限”

企业微信的第三方应用涉及“配置应用权限”,它在不同阶段含义不同:开发阶段意指应用自身所需的功能权限,安装阶段意指企业管理员对应用使用范围的控制,产生此歧义的问题,归根到低还是语言的缩写问题,设想一…

YOLOv11改进大全:从卷积层到检测头,全方位提升目标检测性能

## 1 引言YOLO(You Only Look Once)系列作为目标检测领域的重要算法,以其**高效推理**和**良好精度**赢得了广泛认可。2024年9月,Ultralytics团队正式发布了YOLOv11,在先前版本基础上引入了**多项架构改进**和**训练优…

JWT全面理解

目录 一、JWT是什么 1、身份认证(最核心用途) 2、信息交换 3、授权控制 二、JWT的核心价值 三、如何理解JWT的结构和工作原理 1、三部分结构解析 2、核心工作流程 四、JWT的使用步骤 1、添加依赖 2、添加配置文件 3、创建实体类 4、创建JWT…

量子文件传输系统:简单高效的文件分享解决方案

🌐 在线体验地址:https://share-file.narutogis.com/ 📤 项目概述 量子文件传输系统是一款基于Python Flask开发的高效文件管理与分享工具,致力于提供简单、安全、可靠的文件传输解决方案。系统支持用户管理、文件上传下载、自动…

基于 GitHub Actions 的零成本自动化部署:把 Vite/Vue3 项目一键发布到 GitHub Pages 的完整实战

1. 实现自动化部署1.1. 创建 vue 项目# 1. 安装/确认 Node.js(>14) node -v # 推荐 20.x# 2. 创建项目(交互式,选 Vue3 Router 等) npm init vuelatest github-actions-demo # 创建vite项目 # 或:v…

minio 文件批量下载

MinIO 批量下载功能说明 1. 功能描述 前端勾选多个对象文件后,一次性将这些对象从 MinIO 拉取并打包成 ZIP,通过浏览器直接下载。整体特性: 支持跨桶批量下载(不同 bucket 的对象可同时下载)。服务端采用流式压缩边…

机器学习11——特征选择与稀疏学习

上一章:机器学习10——降维与度量学习 下一章:【从 0 到 1 落地】机器学习实操项目目录:覆盖入门到进阶,大学生就业 / 竞赛必备[TOC] 机器学习实战项目:【从 0 到 1 落地】机器学习实操项目目录:覆盖入门到…

整理python快速构建数据可视化前端的Dash库

一.Dash框架# 导入 Dash 相关库 import dash from dash import dcc, html # dcc 是 Dash 核心组件库,html 是 HTML 组件库 from typing import Generic# 创建一个 Dash 应用实例 app dash.Dash(__name__)# 定义应用的布局 app.layout html.Div(children[# 添加一…

RNN循环神经网络(一):基础RNN结构、双向RNN

RNN循环神经网络 什么是循环神经网络? 循环神经网络(Recurrent Neural Network, RNN)是一类专门用于处理序列数据的神经网络架构。与传统的前馈神经网络不同,RNN具有"记忆"能力,能够捕捉数据中的时间依赖关系…

#C语言——刷题攻略:牛客编程入门训练(十):攻克 循环控制(二),轻松拿捏!

🌟菜鸟主页:晨非辰的主页 👀学习专栏:《C语言刷题合集》 💪学习阶段:C语言方向初学者 ⏳名言欣赏:"代码行数决定你的下限,算法思维决定你的上限。" 目录 1. BC82 乘法表…

daily notes[16]

文章目录意大利语单词 **“bello”**一、核心含义二、变形规则:最重要的部分1. 当 “bello” 位于 **名词前面** 时2. 当 “bello” 位于 **名词后面** 或 **动词后面** 时三、用法总结与对比四、其他用法和常见表达references意大利语单词 “bello” 融合了 指示形…

【知识库】计算机二级python操作题(二)

文章目录基本操作题1基本操作题2基本操作题3简单应用题1简单应用题2综合应用题1基本操作题1考生文件夹下存在一个文件PY101.py,请写代码替换横线,不修改其他代码,实现以下功能,随机选择一个手机品牌屏幕输出。 # 请在...处使用一行…

Nginx 服务用户与防盗链配置

目录 Nginx 服务用户与防盗链配置 1. 隐藏版本号 1.1 配置方法 1.2 生效与验证 2. 修改当前程序账号 2.1 操作步骤 3. 缓存时间 3.1 配置方法 3.2 说明 4. 日志分割 4.1 实现方式(脚本自动分割) 5. 连接超时时间 5.1 核心超时指令&#xff0…

域格4G模块通信协议之HTTP(三):下载大文件的两种方式

域格ASR系列模块支持HTTP下载大文件,本文将提供两种方式。一、直接通过URC上报数据基础操作核心指令说明配置说明响应说明应用示例注意点二、HTTP Range分段下载核心指令说明注意点一、直接通过URC上报数据 若文件体积适中,且需要 MCU 即时处理数据&…

Android 图片 OOM 防护机制设计:大图加载、内存复用与多级缓存

1. 为什么图片加载总让 Android 开发抓狂? 图片是 Android 应用中不可或缺的元素,从用户头像到高清壁纸,从商品详情页到动态表情包,图片无处不在。然而,图片加载是内存管理的雷区,稍不留神就可能触发臭名昭著的 OutOfMemoryError(OOM)。为啥图片这么“吃内存”?原因很…

9月9日

TCP 服务器端#include <myhead.h> #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.108.179" //服务器IP地址 int main(int argc, const char *argv[]) {//创建一个用于连接的套接字文件描述符int sfd socket(AF_INET, SOCK_STRE…

Docker生产部署

目录 一、准备工作&#xff1a;理解 Docker 与 Spring Boot 的关系 1. Docker 是什么&#xff1f; 2. Spring Boot 为什么适合 Docker&#xff1f; 二、编写Dockerfile 三、配置管理 挂载外部配置文件 四、用 docker-compose 编排多服务 一、准备工作&#xff1a;理解 Do…