【shell脚本编程】-6 监控脚本 - 详解
1、脚本要求
- 写一个监控脚本,监控系统负载,如果系统负载超过10,需要记录系统的状态信息
- 系统负载命令使用uptime查看,过去一分钟的平均负载
- 系统状态需要使用如下标记top vmstat ss
- 要求每隔20s监控一次
- 系统状态信息需要保存到/opt/logs文件下 ,保留一个月,文件名建议带有日期
2、脚本编写
#!/bin/bash
[ -d /opt/logs ] || mkdir -p /opt/logs
while :
do
load=`uptime |awk -F 'average:' '{print $2}'|cut -d ',' -f1|sed 's/ //g' | cut -d. -f1`
if [ $load -gt 10 ]
then
top -bn1 | head -n 100 > /opt/logs/top.`date +%s`
vmstat 1 10 > /opt/logs/vmstat.`date +%s`
ss -an > /opt/logs/ss.`date +%s`
fi
sleep 20
find /opt/logs \( -name "top*" -o -name "vmstat*" -o -name "ss*" \) -mtime +30 | xargs rm -f
done
3、脚本解释
#!/bin/bash
[ -d /opt/logs ] || mkdir -p /opt/logs
#[ -d /opt/logs ]:检查/opt/logs是否为一个已存在的目录。
#|| mkdir -p /opt/logs:如果目录不存在,则创建该目录(-p确保父目录不存在时也能创建,这里直接创建/opt/logs)。
#作用:保证后续日志文件有地方存储,避免写入失败。
while :
do
load=`uptime |awk -F 'average:' '{print $2}'|cut -d ',' -f1|sed 's/ //g' | cut -d. -f1`
if [ $load -gt 10 ]
then
top -bn1 | head -n 100 > /opt/logs/top.`date +%s`
vmstat 1 10 > /opt/logs/vmstat.`date +%s`
ss -an > /opt/logs/ss.`date +%s`
fi
sleep 20
find /opt/logs \( -name "top*" -o -name "vmstat*" -o -name "ss*" \) -mtime +30 | xargs rm -f
#作用:删除 30 天前的日志文件,避免磁盘空间被占满。
#find /opt/logs:在/opt/logs目录下查找文件。
#( -name "top*" -o ... ):匹配文件名以top、vmstat或ss开头的文件(-o表示 “或”)。
#-mtime +30:筛选修改时间超过 30 天的文件。
#| xargs rm -f:将找到的文件传递给rm -f强制删除
done
#while :::是一个恒为真的命令,因此这是一个无限循环,会持续执行循环内的逻辑。
#sleep 20:每次循环结束后暂停 20 秒,避免频繁执行占用资源。
#作用:提取系统1 分钟平均负载的整数部分(负载是衡量系统繁忙程度的指标,数值越高表示系统越繁忙)。
分步解析:
#uptime:输出系统运行时间和平均负载(格式如:load average: 12.34, 10.12, 8.76,分别对应 1/5/15 分钟平均负载)。
#awk -F 'average:' '{print $2}':以average:为分隔符,取后半部分(即负载数值部分: 12.34, 10.12, 8.76)。
#cut -d ',' -f1:以逗号为分隔符,取第一个数值(即 1 分钟负载: 12.34)。
#sed 's/ //g':去除空格(得到12.34)。
#cut -d. -f1:以小数点为分隔符,取整数部分(得到12)。
#条件:当 1 分钟平均负载的整数部分($load)大于 10 时,执行以下操作。
收集的信息:
#top -bn1 | head -n 100 > ...:top命令非交互模式(-b)执行 1 次(-n1),取前 100 行(系统进程排名等信息),保存到/opt/logs/top.时间戳(date +%s输出当前秒级时间戳,确保文件名唯一)。
#vmstat 1 10 > ...:vmstat(虚拟内存统计)每 1 秒(1)输出 1 次,共 10 次(10),记录系统 CPU、内存、IO 等状态,保存到vmstat.时间戳。
#ss -an > ...:ss(网络连接统计)显示所有连接(-a),不解析服务名(-n,直接显示端口),记录网络连接状态,保存到ss.时间戳。
4、脚本总结
该脚本的核心功能是:每 20 秒监控一次系统 1 分钟平均负载,当负载超过 10 时,自动收集进程、系统资源、网络连接等关键信息到/opt/logs目录,并定期删除 30 天前的旧日志,用于系统异常时的问题排查。