第十七章 系统监控脚本

第十七章系统监控脚本

上一章我们介绍了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 小结

以上案例可总结出,在编写监控脚本时,其实是通过性能查看命令,截取出所需要的数据,加以分析,记录日志。在数据获取、分析时,若是不便于直接分析的,则可先导入到一个临时文件中,再逐行读取文档内容,逐列获取分析。

原文发布于微信公众号 - 教主小筑(gh_e0879483602d)

原文发表时间:2019-04-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券