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目录时提示用户要先cd到bin目录下;
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
判断是否需要监控502,to_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的服务器地址、端口以及user、password
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大于90且send=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
转载于:https://blog.51cto.com/12216458/2288349