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
的输出是否等于1
(1
表示 正确,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,发送邮件告警
这个脚本整体上是一个简单的系统资源监控工具,当任何一项资源使用超过预设阈值时,会通过邮件通知管理员。