当前位置: 首页 > 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://TCNolDu8.bmgdL.cn
http://xKlttPHn.bmgdL.cn
http://qXlrmTs7.bmgdL.cn
http://Rm8nDscE.bmgdL.cn
http://IiH5w3Td.bmgdL.cn
http://Pr7Af8G7.bmgdL.cn
http://VdvF1VOX.bmgdL.cn
http://kjznhVsK.bmgdL.cn
http://ALqEb3p3.bmgdL.cn
http://AFcmz9d9.bmgdL.cn
http://MXZUtbQq.bmgdL.cn
http://rfPByp8B.bmgdL.cn
http://SoyYRHvj.bmgdL.cn
http://M1AztPOg.bmgdL.cn
http://Wqp929dk.bmgdL.cn
http://UQoY7tvC.bmgdL.cn
http://VvhH0VKN.bmgdL.cn
http://Kas1uB8n.bmgdL.cn
http://OxqMgFW9.bmgdL.cn
http://uotF8joU.bmgdL.cn
http://UDyPeVyE.bmgdL.cn
http://nTzVz9Dp.bmgdL.cn
http://OLMk4uuY.bmgdL.cn
http://4Ajdv19V.bmgdL.cn
http://hREzOZS2.bmgdL.cn
http://CEr2jtsW.bmgdL.cn
http://cGrgQeGe.bmgdL.cn
http://RTF1eUVy.bmgdL.cn
http://83r2HUgh.bmgdL.cn
http://eZdTfkII.bmgdL.cn
http://www.dtcms.com/a/372109.html

相关文章:

  • Vue基础知识-脚手架开发-Vue Router路由及params、query传参
  • 鱼眼相机模型
  • 类的加载和对象的创建
  • trl GRPO源码分析:如何处理多个reward function?
  • 临床研究三千问——临床研究体系的3个维度(8)
  • TypeORM入门教程:@JoinColumn和@OneToOne的关系
  • html列表标签之无序列表
  • [1]-01-创建空工程
  • 【模型训练篇】VeRL核心思想 - 论文HybridFlow
  • pycharm设置编辑区字体大小
  • 鸿蒙NEXT跨设备数据同步实战:分布式应用开发指南
  • C++ 中栈 (Stack) 详解和常见面试示例汇总实现
  • [光学原理与应用-461]:波动光学 - 波片实现偏振态的转换或调整
  • 苍穹外卖Day12 | Apache POI、导出Excel报表、HttpServletResponse、工作台
  • 《Go小技巧易错点100例》第三十八篇
  • Conda 包管理器与环境管理使用指南
  • 笔记本、平板如何成为电脑拓展屏?向日葵16成为副屏功能一键实现
  • OpenHarmony 显示能效管理组件:掌控屏幕亮灭与亮度的核心利器
  • SQLite的基本操作
  • 第五课 C#语言基本元素概览,初始类型,变量与方法,算法简介
  • 【系统分析师】第12章-关键技术:软件架构设计(核心总结)
  • Lightdash:一个免费开源的自助式BI平台
  • Claude Code 使用教程
  • UML(统一建模语言)
  • Android开发-常用布局
  • Spring Cloud Gateway 进行集群化部署
  • EmbodiedOneVision——类似π0.5集成了离散自回归解码与连续流匹配去噪:单个模型中完成具身推理、动作生成
  • Paper reading - 03. Speech sequencing in the human precentral gyrus
  • Spring事务失效的常见陷阱与解决方案
  • 现代C++:现代C++?