前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第十七章 系统监控脚本

第十七章 系统监控脚本

作者头像
晓天
发布2019-07-04 14:22:00
7940
发布2019-07-04 14:22:00
举报

第十七章系统监控脚本

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 教主小筑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档