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

深入解析:Shell脚本监控系统资源详解

Shell脚本监控系统资源详解

这是一个用于监控系统资源使用情况的bash脚本,当CPU、内存、磁盘、IO或网络流量超过阈值时会发送邮件告警。下面我将逐行解释这个脚本:

#! /bin/bash
EMATL="输入你的邮箱"
NET="ens33"
DATE=$(date "+%Y-%m-%d %H:%M:%S")
# 初始化告警信息
#========================cup=============================
CPU=$(top -bn1 | grep "Cpu" | awk '{print 100-$8}')
if [ $(echo "$CPU > 80" | bc) -eq 1 ]; then
        echo "CPU使用率过高: ${CPU}%" | mail -s "cpu警告 - $DATE " "$EMATL "
fi

#=======================内存==============================
MEM=$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100}')
if [ $(echo "$MEM > 80" | bc) -eq 1 ]; then
        echo "内存使用率过高: ${MEM}%" | mail -s "内存警告 - $DATE" "$EMATL"
fi
#========================磁盘==================================
DISK=$(df / | awk 'NR==2{print $5}' | tr -d '%')
if [ $DISK -gt 80 ]; then
        echo "磁盘空间不足: ${DISK}%" | mail -s "磁盘警告 - $DATE " "$EMATL"
fi

#=======================监控io等待==========================

IO=$(iostat -dx 1 2 | awk '/^[a-z]/{if($10>=0)printf "%s: %sms\n", $1, $10}'   )
if [ -n "$IO" ]; then
    echo -e "这些设备IO等待过高: \n${IO}" | mail -s "IO告警 - $DATE " $EMATL
fi

#===================监控网络流量=========================
NET_THRESHOLD=10
rx1=$(cat /sys/class/net/ens33/statistics/rx_bytes)

tx1=$(cat /sys/class/net/ens33/statistics/tx_bytes)
sleep 1
rx2=$(cat /sys/class/net/ens33/statistics/rx_bytes)
tx2=$(cat /sys/class/net/ens33/statistics/tx_bytes)

rx_rate=$(( (rx2 - rx1) / 1024 / 1024 ))
tx_rate=$(( (tx2 - tx1) / 1024 / 1024 ))

if [ $rx_rate -gt $NET_THRESHOLD ] || [ $tx_rate -gt $NET_THRESHOLD ]; then
    echo "网络流量过高: 下载${rx_rate}MB/s, 上传${tx_rate}MB/s\n" | mail -s "网络流量警告 - $DATE " $EMATL
fi

#! /bin/bash

指定使用bash shell来执行这个脚本

EMATL="输入你的邮箱"

定义一个变量EMATL,用于存储接收告警邮件的邮箱地址(使用时需要替换为实际邮箱)

NET="ens33"

定义网络接口名称为ens33(这是一个常见的Linux网络接口名称

DATE=$(date "+%Y-%m-%d %H:%M:%S")

获取当前日期和时间,格式为"年-月-日 时:分:秒",并存储在变量DATE

CPU监控部分

CPU=$(top -bn1 | grep "Cpu" | awk '{print 100-$8}')

使用top -bn1            获取一次系统状态快照

grep "Cpu"              筛选出CPU使用情况的行

awk '{print 100-$8}'       计算CPU使用率(100减去空闲CPU百分比)

if [ $(echo "$CPU > 80" | bc) -eq 1 ]; then echo "CPU使用率过高: ${CPU}%" | mail -s "cpu警告 - $DATE " "$EMATL" fi

echo "$CPU > 80" | bc​:将比较表达式传给 bc计算器

-eq 1​:检查 bc的输出是否等于 11表示 正确,true)

如果CPU使用率超过80%,就发送邮件告警

bc:是 Linux/Unix 系统中一个强大的​命令行计算器工具​,支持​高精度数学运算​​、​​进制转换​​、​​逻辑运算​​等。它类似于一个简易的编程语言,可以交互式使用,也可以在 Shell 脚本中调用。

内存监控部分

MEM=$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100}')

free       获取内存使用情况

grep Mem    筛选出内存信息行

awk       计算已用内存百分比,保留一位小数

if [ $(echo "$MEM > 80" | bc) -eq 1 ]; then echo "内存使用率过高: ${MEM}%" | mail -s "内存警告 - $DATE" "$EMATL" fi

如果内存使用率超过80%,发送邮件告警

磁盘监控部分

DISK=$(df / | awk 'NR==2{print $5}' | tr -d '%')

df / 获取根分区的磁盘使用情况•

awk 'NR==2{print $5}'提取使用百分比

tr -d '%' 删除百分号

if [ $DISK -gt 80 ]; then echo "磁盘空间不足: ${DISK}%" | mail -s "磁盘警告 - $DATE " "$EMATL" fi

如果磁盘使用率超过80%,发送邮件告警

IO监控部分

IO=$(iostat -dx 1 2 | awk '/^[a-z]/{if($10>50)printf "%s: %sms\n", $1, $10}')

使用 iostat命令获取磁盘统计信息:

-d:仅显示设备统计信息

-x:显示扩展统计信息

1 2:每隔 1 秒输出一次,共输出 2 次

通过管道 |将结果传递给 awk处理:

/^[a-z]/:只处理以小写字母开头的行(即设备名行)

if($10>50):检查第 10 列的值(await,I/O 平均等待时间)是否大于 50 毫秒

printf "%s: %sms\n", $1, $10:如果大于 50,则格式化输出设备名(1)和等待时间(10)

将结果赋值给变量 IO

printf格式字符串​​:定义输出的格式,可以包含普通文本和​​格式说明符​​(如 %s%d%f

%s ​printf格式字符串中的一个格式说明符​​,表示这里要插入一个 ​字符串


if [ -n "$IO" ]; then

检查变量 IO是否非空(即是否有设备 I/O 等待时间超过阈值)


echo -e "这些设备IO等待过高: \n${IO}ms" | mail -s "IO告警 - $DATE " $EMAT
如果检测到高 I/O 等待,则发送邮件:

echo -e:启用转义字符解释

"这些设备IO等待过高: \n${IO}":邮件正文内容

网络流量监控部分

NET_THRESHOLD=10

设置网络流量阈值为10MB/s

rx1=$(cat /sys/class/net/ens33/statistics/rx_bytes)

tx1=$(cat /sys/class/net/ens33/statistics/tx_bytes)

获取网络接口ens33的当前接收(rx)和发送(tx)字节数

其中 rx_bytes​(receive bytes)代表​​接收的字节数​​,也就是​​下载流量​

tx_bytes​(transmit bytes)代表​​发送的字节数​​,也就是​​上传流量​

/sys/class/net/

Linux 的​网络设备信息目录​,所有网卡(物理网卡、虚拟网卡)都会在这里显示对应的子目录。

ens33​:具体网卡名称

statistics/

网卡的统计信息文件,该目录下还有其他重要统计文件:

文件

含义

rx_bytes

接收的总字节数

rx_packets

接收的数据包数量

tx_bytes

发送的总字节数

tx_packets

发送的数据包数量

rx_dropped

丢弃的接收包数

tx_dropped

丢弃的发送包数

rx_bytes记录该网卡​​从启动至今累计接收的数据总字节数

sleep 1

等待1秒

rx2=$(cat /sys/class/net/ens33/statistics/rx_bytes)

tx2=$(cat /sys/class/net/ens33/statistics/tx_bytes)

再次获取接收和发送字节数

rx_rate=$(( (rx2 - rx1) / 1024 / 1024 )) tx_rate=$(( (tx2 - tx1) / 1024 / 1024 ))

计算1秒内的接收和发送速率,转换为MB/s

if [ $rx_rate -gt $NET_THRESHOLD ] || [ $tx_rate -gt $NET_THRESHOLD ]; then echo "网络流量过高: 下载${rx_rate}MB/s, 上传${tx_rate}MB/s\n" | mail -s "网络流量警告 - $DATE " $EMATL fi

如果下载或上传速率超过10MB/s,发送邮件告警

这个脚本整体上是一个简单的系统资源监控工具,当任何一项资源使用超过预设阈值时,会通过邮件通知管理员。

http://www.wxhsa.cn/company.asp?id=4519

相关文章:

  • 计算几何全家桶
  • 完整教程:从无声视频中“听见”声音:用视觉语言模型推理音频描述
  • Win10如何安装语音包
  • C#通过TCP/IP控制康奈视读码枪实现方案
  • 链表
  • 利用三方APP[IP切换助手]使用socks5
  • 智能卫浴雷达模块感应方案WT4101寿命长不怕干扰
  • 修改Windows 资源器中文件的创建时间或更新时间
  • Mysql练习,15个必练语句带你玩转数据库
  • 威力导演2026中文版 CyberLink PowerDirector 2026 v24.0 旗舰版更新内容
  • 越权漏洞
  • GAS_Aura-Ability Tasks
  • 本地大模型的崛起:为什么越来越多人不用云端 AI?
  • Gitee:国产代码托管平台如何重塑企业研发效能版图
  • CompassBench 大模型评测
  • Windows截图工具Acropalypse漏洞剖析:开发者中心安全的重要教训
  • bootstrap-flex总结
  • 【源码解读之 Mybatis】【基础篇】-- 第2篇:配置系统深度解析
  • eSIM笔记
  • 拯救者Y7000过热降频解决方法
  • 普通大语言模型(LLM)和向量化模型(Embedding Model)的区别以及其各自的作用
  • ios电脑如何改成windows系统
  • PythonFlask 运用 DBUtils 创建通用连接池
  • 帧同步、快照同步与状态同步
  • 内存一致性模型
  • MahMetro 框架学习
  • 基于MATLAB的标准化降水蒸散指数(SPEI)实现
  • Prometheus Probe 监控配置文档
  • 客户案例|邦普循环x甄知科技,筑牢高效智能的IT运维底座
  • VMware Exporter 指标转换方案