20.20 告警系统主脚本

 

以后将所有shell脚本放在/usr/local/sbin

 

将监控脚本放在/usr/local/sbin下:

[root@hyc-01-01 ~]# cd /usr/local/sbin

[root@hyc-01-01 sbin]# mkdir mon

[root@hyc-01-01 sbin]# cd mon

[root@hyc-01-01 mon]# mkdir bin conf shares log mail

创建并编辑主脚本:

[root@hyc-01-01 mon]# cd bin

主脚本用于判断某监控项是否需要监控,若需要监控则调对应项的子脚本:

[root@hyc-01-01 bin]# vim main.sh

 

#!/bin/bash

#Written by aming.

# 是否发送邮件的开关

export send=1

send被修改为1则以下所有监控项均会发送邮件,在系统维护时应关闭;

此处使用了export,表示所有变量都会应用于子脚本中;

# 过滤ip地址

export addr=`/sbin/ifconfig |grep -A1 "ens33: "|awk '/inet/ {print $2}'`

ifconfig命令结果中过滤出本机ens33网卡的ip,告诉用户是哪一台机器发的告警;

dir=`pwd`

# 只需要最后一级目录名

last_dir=`echo $dir|awk -F'/' '{print $NF}'`

检测当前用户所在的最后一级目录,用户无法保证所有机器上的mon目录都在/usr/local/sbin下,这里需要确定主脚本main.sh所在的最后一级目录

# 下面的判断目的是,保证执行脚本的时候,我们在bin目录里,不然监控脚本、邮件和日志很有可能找不到

if [ $last_dir == "bin" ] || [ $last_dir == "bin/" ]; then

conf_file="../conf/mon.conf"

定义配置文件所在路径

else

    echo "you shoud cd bin dir"

exit

由于脚本中存在大量相对路径,所以脚本接下来的内容正常执行的前提是必须在mon目录中的bin目录下,所以需要判断用户真的在bin目录下;

当判断用户不在mon目录下的bin目录时提示用户要先cdbin目录下;

fi

exec 1>>../log/mon.log 2>>../log/err.log

定义执行脚本时输出正确和错误的日志到指定文件;

echo "`date +"%F %T"` load average"

打印出本次的执行日期,打印当前系统负载;

/bin/bash ../shares/load.sh

在主脚本中直接调用子脚本load.sh即监控load

#先检查配置文件中是否需要监控502

if grep -q 'to_mon_502=1' $conf_file; then

判断是否需要监控502to_mon_502=1则执行,否则不执行;

export log=`grep 'logfile=' $conf_file |awk -F '=' '{print $2}' |sed 's/ //g'`

$conf_file中过滤出logfile=所在的行

    /bin/bash  ../shares/502.sh

fi

 

[root@hyc-01-01 bin]# dir=`pwd`;echo $dir|awk -F'/' '{print $NF}'

Bin

当用户在一个脚本中执行pwd命令时,命令结果将显示该脚本所在路径

 

20.21 告警系统配置文件

 

配置文件必须放在mon/conf目录下:

[root@hyc-01-01 conf]# vim mon.conf

## to config the options if to monitor

## 定义mysql的服务器地址、端口以及userpassword

to_mon_cdb=0? ?##0 or 1, default 0,0 not monitor, 1 monitor

是否监控cdb数据库,若监控则等于1,否则等于0

db_ip=10.20.3.13

db_port=3315

db_user=username

db_pass=passwd

## httpd? ?如果是1则监控,为0不监控

to_mon_httpd=0

## php 如果是1则监控,为0不监控

to_mon_php_socket=0

## http_code_502??需要定义访问日志的路径

to_mon_502=1

logfile=/data/log/xxx.xxx.com/access.log

监控502时必须到指定站点访问日志查看状态码

## request_count? ?定义日志路径以及域名

to_mon_request_count=0

req_log=/data/log/www.discuz.net/access.log

domainname=www.discuz.net

监控请求数

 

20.22 告警系统监控项目

 

定义子脚本:

load.sh

 

[root@hyc-01-01 shares]# vim load.sh

#! /bin/bash

##Writen by aming##

load=`uptime |awk -F 'average:' '{print $2}'|cut -d',' -f1|sed 's/ //g' |cut -d. -f1`

求出系统负载值

if [ $load -gt 10 ] && [ $send -eq "1" ]

判断系统负载是否高于设置的阈值,若高于则判断send参数是否为1,若是则执行以下操作

then

echo "$addr `date +%T` load is $load" >../log/load.tmp

打印本机地址、当前日期及负载值重定向到load.tmp文件,发邮件时会用到该文件的内容

/bin/bash ../mail/mail.sh aming_test@163.com "$addr\_load:$load" `cat ../log/load.tmp`

执行发邮件脚本

fi

echo "`date +%T` load is $load"

打印日期及系统负载值,该内容会根据主脚本的定义被记录到日志文件中

 

[root@hyc-01-01 shares]# uptime |awk -F 'average:' '{print $2}'|cut -d',' -f1|sed 's/ //g' |cut -d. -f1

0

获取load average的值

 

502.sh

 

#! /bin/bash

d=`date -d "-1 min" +%H:%M`

变量d为一分钟前的时间

c_502=`grep :$d:  $log  |grep ' 502 '|wc -l`

从日志文件查找一分钟前包含关键字502的条数并统计行数(计算有多少条502

if [ $c_502 -gt 10 ] && [ $send == 1 ]; then

     echo "$addr $d 502 count is $c_502">../log/502.tmp

打印ip地址及502条数信息重定向到指定临时文件502.tmp

     /bin/bash ../mail/mail.sh $addr\_502 $c_502  ../log/502.tmp

执行发邮件脚本,指定发送主题、发送给谁及发送内容

fi

echo "`date +%T` 502 $c_502"

打印日期及502条数信息

 

[root@hyc-01-01 shares]# date -d "-1 min" +%H:%M

16:39

一分钟前的时间

 

disk.sh

 

#! /bin/bash

##Writen by aming##

rm -f ../log/disk.tmp

删除disk.tmp

for r in `df -h |awk -F '[ %]+' '{print $5}'|grep -v Use`

do

if [ $r -gt 90 ] && [ $send -eq "1" ]

判断当$r大于90send=1时执行后续的操作

then

echo "$addr `date +%T` disk useage is $r" >>../log/disk.tmp

打印本机地址、时间信息及磁盘使用率并输出到disk.tmp,执行该步会创建disk.tmp

fi

if [ -f ../log/disk.tmp ]

判断文件是否存在,若文件存在则执行后续操作

then

    df -h >> ../log/disk.tmp

    /bin/bash ../mail/mail.sh $addr\_disk $r ../log/disk.tmp

    echo "`date +%T` disk useage is nook"

else

    echo "`date +%T` disk useage is ok"

fi

 

[root@hyc-01-01 shares]# df -h |awk -F '[ %]+' '{print $5}'|grep -v Use

以一个或多个空格和百分号作为分隔符,打印第五段,再在打印的内容中查找不包含Use的行;

已用

49

0

0

1

0

58

0

查看各个分区容量已用百分比

[root@hyc-01-01 shares]# df -h

文件系统        容量  已用  可用 已用% 挂载点

/dev/sda3        18G  8.6G  9.3G   49% /

devtmpfs        907M     0  907M    0% /dev

tmpfs           916M     0  916M    0% /dev/shm

tmpfs           916M  8.6M  908M    1% /run

tmpfs           916M     0  916M    0% /sys/fs/cgroup

/dev/sda1       197M  113M   84M   58% /boot

tmpfs           184M     0  184M    0% /run/user/0

 

当语言被修改为en时,最上面一行将显示为英文,此时该行将被过滤掉:

[root@hyc-01-01 shares]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3        18G  8.6G  9.3G  49% /

devtmpfs        907M     0  907M   0% /dev

tmpfs           916M     0  916M   0% /dev/shm

tmpfs           916M  8.6M  908M   1% /run

tmpfs           916M     0  916M   0% /sys/fs/cgroup

/dev/sda1       197M  113M   84M  58% /boot

tmpfs           184M     0  184M   0% /run/user/0

[root@hyc-01-01 shares]# echo $LANG

zh_CN.UTF-8

[root@hyc-01-01 shares]# df -h |awk -F '[ %]+' '{print $5}'|grep -v Use

已用

49

0

0

1

0

58

0

[root@hyc-01-01 shares]#

[root@hyc-01-01 shares]# df -h |awk -F '[ %]+' '{print $5}'|grep -v Use

49

0

0

1

0

58

0