第十七章系统监控脚本
上一章我们介绍了shell编程的语法和应用,在实际生产环境中,Linux的系统运维者经常会查看系统中的各项性能、参数,为了提高查看效率,我们可以编写一些监控脚本以便系统的自动化运维。
一般,在编写脚本时,不需要编写问题的解决代码,因为各种问题的原因、解决方式不同,若要编写脚本实现,会十分复杂。所以,我们一般只是编写脚本,监控到报警数据后记录日志,具体问题的解决还是需要我们人为手动操作的。下面来看几个较常用的案例。
一般自定义脚本都会存放在统一的路径下,以便于查找、管理,如:假设我们编写的脚本都存放在自己创建的/var/scripts/,并且监控脚本生成的日志文件,也存放在统一位置,如:我们手动创建 /var/monitorLogs/目录。
17.1 文件系统监控
案例介绍:监控文件系统使用率,当某个文件系统使用率超过70%时,报警并记录日志。
编程思路:df获取文件系统使用率后导入到一个临时文件中,再逐行读取、分析,截取使用率列,去除%符号获取纯数字,然后判断是否超出警告阈值,若超了则记录入日志。
vi /var/scripts/dfMonitor.sh
#!/bin/bash
date +"20%y-%m-%d %H:%M:%S">> /var/monitorLogs/df.log
df -h | tail -n +2 > /tmp/df.tmp
while read hang
do
shu=`echo $hang | awk '{print $5}'`
shu2=${shu%%%*}
if [ $shu2 -ge 70 ];then
echo $hang >>/var/monitorLogs/df.log
fi
done < /tmp/df.tmp
rm -rf /tmp/df.tmp
echo "" >> /var/monitorLogs/df.log #空行,为了与下一次的监控有分隔
# chmod a+x /mnt/dfMonitor.pl 增加执行权限
# 该脚本 使用cron设定为每天夜间检查一次,记录日志
脚本解释:当我们使用df命令时,显示的文件系统使用率会有%符号,无法做数字的比较判断,所以我们先把df的结果保存到一个临时文件中,再逐行读取文件内容,逐个分析每个文件系统的使用情况,使用率到达70%的记录到日志中。
脚本中采用了 变量截取的方式获取纯数字的使用率,如:shu2=${shu%%%*}句,变量shu存放的是文件系统的使用率,但是是携带%符号的,所以使用${shu%%%*}将%去除,只保留数字部分(%%表示去除右侧字符,第三个%表示被去除的%符号)。
17.2 CPU监控脚本
案例介绍:监控CPU,当cpu使用率超70%时,统计服务进程数,假设本机提供的服务是http服务。
脚本思路:通过sar命令查看cpu使用率,获取idle的值,因为显示的是带小数的,所以先截取到整数部分(因为if判断对整数判断最为简便),再判断是否到达报警阈值,若到达则查询所有进程,抓取http进程并统计数量。
vi /var/scripts/cpuMonitor.sh
#!/bin/bash
date +"20%y-%m-%d %H:%M:%S">> /var/monitorLogs/cpu.log
shu=`sar 1 1 | tail -n 1 | awk '{print $8}' ` #获取cpu空闲率
shu2=${shu%%.*} # shell一般不使用小数的计算和比较,所以去除小数位
if [ $shu2 -le 30 ]; then
ps -aux | grep http | wc -l >> /var/monitorLogs/cpu.log
fi
echo "" >> /var/monitorLogs/cpu.log
#使用cron设置本脚本每2个小时执行一次
若此脚本不想用cron调用执行,则可在代码中加入while循环和sleep控制循环周期,完整代码如下:
#!/bin/bash
#监控CPU,当cpu使用率超70%时,统计服务进程数,假设本机提供的服务是#http
while true
do
date +"20%y-%m-%d %H:%M:%S">> /var/monitorLogs/cpu.log
shu=`sar 1 1 | tail -n 1 | awk '{print $8}' ` #获取cpu空闲率
shu2=${shu%%.*} # shell一般不使用小数的计算和比较,所以去除小数位
if [ $shu2 -le 30 ]; then
ps -aux | grep http | wc -l >> /var/monitorLogs/cpu.log
fi
echo "" >> /var/monitorLogs/cpu.log
sleep 7200 # sleep表示让本进程暂时休眠指定的秒数,即暂停执行
done
注意:使用while+sleep的脚本,被执行时,会在前台执行,但因为代码中故意设置的死循环,则脚本会持续执行,占据整个前台资源不退出,影响到我们前台的其他操作。所以,可以把该脚本放入后台。再者为了能够让用户在注销后该脚本仍会运行,则可以使用nohup调用: nohup /var/scripts/cpuMonitor.sh &
再者,因为脚本是周期性记录日志的,那么生成的日志文件,将频繁被写入新内容。如果脚本制定的sleep时间很短(如几秒钟),则日志文件的内容会很快增加新信息,每次都使用cat查看,太过麻烦。所以可以使用tail –f /var/monitorLogs/cpu.log的方式实时显示文档内容。
tips: tail -f 功能是实时显示文档内容,一旦更新立即显示,所以tail -f后是不退出文件的,一直在文件的查看状态,使用ctrl + c命令停止退出。
17.3 内存监控
案例介绍:检查内存使用率,当内存使用率超70%时,记录占内存最高的前10个进程。
脚本思路:通过free命令获取内存总量、使用量两个数据赋值给变量,在计算使用率,判断是否到达阈值,若到达,则查询所有进程,并按占内存比例降序排序后记录前10个进程。
vi /var/scripts/memMonitor.sh
#!/bin/bash
date +"20%y-%m-%d %H:%M:%S" >> /var/monitorLogs/mem.log
zong=`free | grep -i mem | awk '{print $2}'`
yong=`free | grep -i mem | awk '{print $3}'`
let lv=$yong*100/$zong #计算结果会是整数,一般计算不支持小数
if [ $lv -ge 70 ]; then
ps -aux | sort -rn -k 4 | head -n 10 >> /var/monitorLogs/mem.log
fi
echo "" >> /var/monitorLogs/mem.log
# 该脚本 使用cron设定为每天夜间检查一次,记录日志
17.4 僵尸进程监控
案例介绍:查看系统中有无僵尸进程,若有,自动杀死,并做日志记录
脚本思路:抓取僵尸进程,把信息存入临时文档中,逐行读取该文档,获取pid的值,用kill -9 杀死,并记录到日志中。
抓取僵尸进程有两中方式:一种是ps -aux时,进程状态列中会有Z,表示僵尸状态;另一种是在 ps –ef 时,僵尸进程会有<defunct>的标记,如下图:
以下案例采用第二种方式获取僵尸进程。
vi /var/scripts/zombieMonitor.sh
#!/bin/bash
date +"20%y-%m-%d %H:%M:%S">> /var/monitorLogs/zombie.log
ps -ef | grep defunct > /tmp/zom.tmp
while read hang
do
pid=`echo $hang | awk '{print $2}'`
kill -9 $pid
echo $hang >> /var/monitorLogs/zombie.log
done < /tmp/zom.tmp
rm -f /tmp/zom.tmp
echo "" >> /var/monitorLogs/zombie.log
17.5 小结
以上案例可总结出,在编写监控脚本时,其实是通过性能查看命令,截取出所需要的数据,加以分析,记录日志。在数据获取、分析时,若是不便于直接分析的,则可先导入到一个临时文件中,再逐行读取文档内容,逐列获取分析。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有