实战:shell实现系统资源监控与智能告警
前言
Shell脚本的作用是监控系统的CPU、内存以及磁盘使用情况,并在超过特定阈值时记录详细的进程信息。它将这些信息写入到一个日志文件中。由于当前的系统环境中没有部署专门的监控组件,我们需要一种临时方案来监控系统资源。此方案通过Shell脚本实时测量CPU、内存和磁盘使用率,并在超过设定阈值时保存告警信息。该脚本能够帮助管理员快速发现和解决系统性能问题,确保系统稳定运行。
脚本操作
- 定义日志文件路径
在脚本开始处,定义了日志文件的路径。
ALOG="/data1/sysmon.out"
- CPU使用率监控
计算当前系统的CPU使用率,并将其写入日志文件。
cpu=$(expr 100 - $(mpstat | tail -1 | awk '{print $12}' | awk -F. '{print $1}'))
mpstat >> $ALOG
echo "CPU使用率: $cpu %" >> $ALOG
上面这段代码使用mpstat
命令来获取CPU的空闲时间,然后计算使用率。
- 内存使用率监控
计算当前系统的内存使用率,并将其写入日志文件。
nc=$(expr $(free | grep "Mem:" | awk '{print $3}') * 100 / $(free | grep "Mem:" | awk '{print $2}'))
free -h >> $ALOG
echo "内存使用率: $nc %" >> $ALOG
代码使用free
命令来获取内存的总量和已使用量,然后计算内存使用率。
- 磁盘使用率监控
获取根目录的磁盘使用情况,并将其写入日志文件。
cp=$(df -h | grep "/$" | awk '{print $5}' | awk -F% '{print $1}')
echo "磁盘占用率: $cp %" >> $ALOG
代码使用df
命令来获取根目录的磁盘使用率。
- 告警条件判定及详细记录
如果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、内存和磁盘使用情况,并智能输出告警信息和相应的进程详情。通过灵活的数据记录和排序方式,它提高了异常检测的精准度,确保系统管理员能够及时、有效地了解和处理系统负载问题。添加时间戳信息增强了日志的可读性和可追溯性,进一步助力运维工作。