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,发送邮件告警

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值