实战:shell实现系统资源监控与智能告警

前言

Shell脚本的作用是监控系统的CPU、内存以及磁盘使用情况,并在超过特定阈值时记录详细的进程信息。它将这些信息写入到一个日志文件中。由于当前的系统环境中没有部署专门的监控组件,我们需要一种临时方案来监控系统资源。此方案通过Shell脚本实时测量CPU、内存和磁盘使用率,并在超过设定阈值时保存告警信息。该脚本能够帮助管理员快速发现和解决系统性能问题,确保系统稳定运行。

脚本操作

  1. 定义日志文件路径

在脚本开始处,定义了日志文件的路径。

ALOG="/data1/sysmon.out"
  1. CPU使用率监控
    计算当前系统的CPU使用率,并将其写入日志文件。
cpu=$(expr 100 - $(mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}'))
mpstat >> $ALOG
echo "CPU使用率: $cpu %" >> $ALOG

上面这段代码使用mpstat命令来获取CPU的空闲时间,然后计算使用率。

  1. 内存使用率监控

计算当前系统的内存使用率,并将其写入日志文件。

nc=$(expr $(free | grep "Mem:" | awk '{print $3}') * 100 / $(free | grep "Mem:" | awk '{print $2}'))
free -h >> $ALOG
echo "内存使用率: $nc %" >> $ALOG

代码使用free命令来获取内存的总量和已使用量,然后计算内存使用率。

  1. 磁盘使用率监控

获取根目录的磁盘使用情况,并将其写入日志文件。

cp=$(df -h | grep "/$" | awk '{print $5}' | awk -F% '{print $1}')
echo "磁盘占用率: $cp %" >> $ALOG

代码使用df命令来获取根目录的磁盘使用率。

  1. 告警条件判定及详细记录

如果CPU、内存或磁盘使用率超过50%,记录前十个占用最多资源的进程信息。

if [ $cpu -gt 50 ]
then
#cpu前十进程
    ps aux | head -1; ps aux | grep -v PID | sort -rn -k +3 | head >> $ALOG
fi
 
if [ $nc -gt 50 ]
then
#内存占用前十程序
    ps aux | head -1; ps aux | grep -v PID | sort -rn -k +4 | head >> $ALOG
fi
 
if [ $cp -gt 50 ]
then
    df -h >> $ALOG
fi

描述告警时的具体信息:

  • 如果CPU使用率超过50%,记录CPU占用率最高的前十个进程。
  • 如果内存使用率超过50%,记录内存占用率最高的前十个进程。
  • 如果磁盘使用率超过50%,记录详细的磁盘使用信息。

完整脚本

#!/bin/bash
# 日志文件的变量
ALOG="/data1/sysmon.out"
#CPU
cpu=$(expr 100 - $(mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}'))
mpstat >> $ALOG
echo "CPU使用率: $cpu %" >> $ALOG
#内存
nc=$(expr $(free | grep "Mem:" | awk '{print $3}') \* 100 / $(free | grep "Mem:" | awk '{print $2}'))
free -h >> $ALOG
echo "内存使用率: $nc %" >> $ALOG
#磁盘
cp=$(df -h | grep "/$" | awk '{print $5}' | awk -F% '{print $1}')
echo "磁盘占用率: $cp %" >> $ALOG


# 判断是否记录告警
if [ $cpu -gt 50 ]
then
#cpu前十进程
    ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head >> $ALOG
fi
 
if [ $nc -gt 50 ]
then
#内存占用前十程序
    ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head >> $ALOG
fi
 
if [ $cp -gt 50 ]
then
    df -h >> $ALOG
fi

定时执行

#添加执行权限
chmod +x sysmon.sh
#设置每分钟定时执行
crontab -e
* * * * * /root/sysmon.sh

改进建议

  • 灵活配置: 可以将告警阈值和日志路径配置为可传入参数,以增加脚本的灵活性。
  • 增强日志记录: 在日志中添加时间戳信息,便于后续分析时区分不同时间点的数据。
  • 邮件通知: 在告警条件满足时,发送邮件通知管理员,及时处理异常情况。
  • 优化排序: 在ps aux命令中,sort -k参数从+3改为-k3(CPU)和-k4(内存),以适应不同环境中sort命令的用法。
if [ $cpu -gt 50 ]
then
    ps aux | head -1; ps aux | grep -v PID | sort -rn -k3 | head >> $ALOG
fi

if [ $nc -gt 50 ]
then
    ps aux | head -1; ps aux | grep -v PID | sort -rn -k4 | head >> $ALOG
fi

保存并执行上述优化后的脚本,确保其按预期工作,并将监控结果写入日志文件。

优化后的脚本

#!/bin/bash
# 日志文件的变量
ALOG="/data1/sysmon.out"
#取得当前时间戳
timestamp=$(date +"%Y-%m-%d %H:%M:%S")

#CPU
cpu=$(expr 100 - $(mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}'))
mpstat >> $ALOG
echo "$timestamp CPU使用率: $cpu %" >> $ALOG

#内存
nc=$(expr $(free | grep "Mem:" | awk '{print $3}') \* 100 / $(free | grep "Mem:" | awk '{print $2}'))
free -h >> $ALOG
echo "$timestamp 内存使用率: $nc %" >> $ALOG

#磁盘
cp=$(df -h | grep "/$" | awk '{print $5}' | awk -F% '{print $1}')
echo "$timestamp 磁盘占用率: $cp %" >> $ALOG

# 判断是否记录告警
if [ $cpu -gt 50 ]
then
    #cpu前十进程
    ps aux | head -1 >> $ALOG
    ps aux | grep -v PID | sort -rn -k3 | head >> $ALOG
fi

if [ $nc -gt 50 ]
then
    #内存占用前十程序
    ps aux | head -1 >> $ALOG
    ps aux | grep -v PID | sort -rn -k4 | head >> $ALOG
fi

if [ $cp -gt 50 ]
then
    df -h >> $ALOG
fi

总结

这个优化后的脚本实时监控系统的CPU、内存和磁盘使用情况,并智能输出告警信息和相应的进程详情。通过灵活的数据记录和排序方式,它提高了异常检测的精准度,确保系统管理员能够及时、有效地了解和处理系统负载问题。添加时间戳信息增强了日志的可读性和可追溯性,进一步助力运维工作。

关于我
loading