Shell告警监控系统

简介:


blob.png

main.sh  主控制脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
 
# 是否发送邮件的开关(维护模式下我们需要关闭此功能,监控还是继续,但不发任何邮件。)
export  send=1
# 过滤ip地址(一旦报警,需要需要知道是哪台机器的IP,没有服务端,全部都是独立运行的。监控的网卡可以修改,也可更改为hostname)
export  addr=` /sbin/ifconfig  | grep  -A1  "ens33: " | awk  '/inet/ {print $2}' `
dir =` pwd `
# 只需要最后一级目录名
last_dir=` echo  $ dir | awk  -F '/'  '{print $NF}' `
# 下面的判断目的是,保证执行脚本的时候,我们在bin目录里,不然监控脚本、邮件和日志很有可能找不到(脚本中涉及的目录几乎都是相对路径。)!!
if  [ $last_dir ==  "bin"  ] || [ $last_dir ==  "bin/"  ];  then
     conf_file= "../conf/mon.conf"
else
     echo  "you shoud cd bin dir"
     exit
fi
exec  1>>.. /log/mon .log 2>>.. /log/err .log
echo  "`date +" %F %T "` load average"
/bin/bash  .. /shares/load .sh
#先检查配置文件中是否需要监控502
if  grep  -q  'to_mon_502=1'  $conf_file;  then
     export  log=` grep  'logfile='  $conf_file | awk  -F  '='  '{print $2}'  | sed  's/ //g' `
     /bin/bash  .. /shares/502 .sh
fi


mon.conf  配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## to config the options if to monitor
## 定义mysql的服务器地址、端口以及user、password(如下的cdb是我目前的数据库,可选择监控与否)
to_mon_cdb=0   ##0 or 1, default 0,0 not monitor, 1 monitor
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 就会开启监控报警)
to_mon_502=1
logfile= /data/log/xxx .xxx.com /access .log
## request_count  定义日志路径以及域名(监控请求数,如上说明0 或者1开关与否)
to_mon_request_count=0
req_log= /data/log/www .xxx.com /access .log
domainname=www.xxx.com


load.sh  告警系统

1
2
3
4
5
6
7
8
9
#! /bin/bash
 
load=`uptime | awk  -F  'average:'  '{print $2}' | cut  -d ','  -f1| sed  's/ //g'  | cut  -d. -f1`
if  [ $load -gt 10 ] && [ $send - eq  "1"  ]
then
     echo  "$addr `date +%T` load is $load"  >.. /log/load .tmp
     /bin/bash  .. /mail/mail .sh  test @163.com  "$addr\_load:$load"  ` cat  .. /log/load .tmp`
fi
echo  "`date +%T` load is $load"


502.sh  告警系统

1
2
3
4
5
6
7
8
#! /bin/bash
d=` date  -d  "-1 min"  +%H:%M`
c_502=` grep  :$d: $log | grep  ' 502 ' | wc  -l`
if  [ $c_502 -gt 10 ] && [ $send == 1 ];  then
     echo  "$addr $d 502 count is $c_502" >.. /log/502 .tmp
     /bin/bash  .. /mail/mail .sh $addr\_502 $c_502 .. /log/502 .tmp
fi
echo  "`date +%T` 502 $c_502"


disk.sh  告警系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#! /bin/bash
 
rm  -f .. /log/disk .tmp
## 用空格或者%为分隔符,筛选出来磁盘使用量的百分比。
for  in  ` df  -h | awk  -F  '[ %]+'  '{print $5}' | grep  - v  Use`
do
     if  [ $r -gt 90 ] && [ $send - eq  "1"  ]
then
     echo  "$addr `date +%T` disk useage is $r"  >>.. /log/disk .tmp
     fi
done
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


mail.sh  告警收敛

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
log=$1           //log 作为一个变量,接收来自第一个参数的值
t_s=` date  +%s`       // 时间戳
t_s2=` date  -d  "2 hours ago"  +%s`     // 两个小时前的时间戳
if  [ ! -f  /tmp/ $log ]        // 如果日志文件不存在
then
     echo  $t_s2 >  /tmp/ $log       // 把两个小时前的时间戳写到日志
     fi
t_s2=` tail  -1  /tmp/ $log| awk  '{print $1}' `      // 截取时间戳
echo  $t_s>> /tmp/ $log         // 追加当前时间戳
v =$[$t_s-$t_s2]      // 时间戳的时间差(以秒为单位)详情如下1
echo  $ v
if  [ $ v  -gt 3600 ]   // 在此也就是,当过了1小时如果还是没有恢复再次发告警邮件。调用mail.py(如果没有恢复,每1小时发一次)
then
     . /mail .py  $1  $2  $3
     echo  "0"  /tmp/ $log.txt         // 生成一个新的.txt日志。用来记录告警
else
     if  [ ! -f  /tmp/ $log.txt ]        // 判断有没有这个日志文件
     then
     echo  "0"  /tmp/ $log.txt         // 计数器
     fi
     nu=` cat  /tmp/ $log.txt`           // 查看计数器
     nu2=$[$nu+1]                     // 计数器+1
     echo  $nu2> /tmp/ $log.txt          // 把计数器写入日志文件
     if  [ $nu2 -gt 10 ]              
     then
         . /mail .py  $1  "trouble continue 10 min $2"  "$3"          // 代表着已经持续了10分钟了
         echo  "0"  /tmp/ $log.txt     // 重新开始计数
     fi
fi


mail.py  发邮件脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#####脚本使用说明######
#1. 首先定义好脚本中的邮箱账号和密码
#2. 脚本执行命令为:python mail.py 目标邮箱 "邮件主题" "邮件内容"
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import  os,sys
reload(sys)
sys.setdefaultencoding( 'utf8' )
import  getopt
import  smtplib
from email.MIMEText  import  MIMEText
from email.MIMEMultipart  import  MIMEMultipart
from  subprocess  import  *
def sendqqmail(username,password,mailfrom,mailto,subject,content):
     gserver =  'smtp.qq.com'
     gport = 25
     try:
         msg = MIMEText(unicode(content).encode( 'utf-8' ))
         msg[ 'from' ] = mailfrom
         msg[ 'to' ] = mailto
         msg[ 'Reply-To' ] = mailfrom
         msg[ 'Subject' ] = subject
         smtp = smtplib.SMTP(gserver, gport)
         smtp.set_debuglevel(0)
         smtp.ehlo()
         smtp.login(username,password)
         smtp.sendmail(mailfrom, mailto, msg.as_string())
         smtp.close()
     except Exception,err:
         print  "Send mail failed. Error: %s"  % err
def main():
     to=sys.argv[1]
     subject=sys.argv[2]
     content=sys.argv[3]
     sendqqmail( '1234567@qq.com' , 'aaaaaaaaaa' , '1234567@qq.com' ,to,subject,content)    // 定义QQ邮箱的账号和密码
if  __name__ ==  "__main__" :
     main()


crontab 每分钟执行一次

1
* /1  * * * *  cd  /usr/local/sbin/mon/bin bash  main.sh










本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/2065224,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
28天前
|
存储 监控 Shell
【Shell 命令集合 备份压缩 】Linux 备份文件系统 dump命令 使用指南
【Shell 命令集合 备份压缩 】Linux 备份文件系统 dump命令 使用指南
35 0
|
28天前
|
Shell Linux C语言
【Shell 命令集合 系统管理 】Linux 显示系统的平均负载情况 tload命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示系统的平均负载情况 tload命令 使用指南
40 1
|
28天前
|
监控 安全 Shell
【Shell 命令集合 系统管理 】Linux 查看系统上的失败登录记录 lastb命令 使用指南
【Shell 命令集合 系统管理 】Linux 查看系统上的失败登录记录 lastb命令 使用指南
35 0
|
28天前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
43 1
|
28天前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 显示目前登入系统的用户信息 w命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示目前登入系统的用户信息 w命令 使用指南
44 2
|
28天前
|
存储 Unix Shell
【Shell 命令集合 系统管理 】⭐⭐Linux 显示系统的基本信息 uname命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐Linux 显示系统的基本信息 uname命令 使用指南
34 1
|
28天前
|
Linux Shell C语言
【Shell 命令集合 设备管理 】Linux控制Linux系统的键盘LED setleds命令 使用指南
【Shell 命令集合 设备管理 】Linux控制Linux系统的键盘LED setleds命令 使用指南
37 0
|
28天前
|
存储 安全 Shell
【Shell 命令集合 系统管理 】Linux 显示系统中所有用户的登录记录 last命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示系统中所有用户的登录记录 last命令 使用指南
32 0
|
28天前
|
Linux Shell C语言
【Shell 命令集合 系统管理 】Linux 删除Linux系统中的用户组 groupdel命令 使用指南
【Shell 命令集合 系统管理 】Linux 删除Linux系统中的用户组 groupdel命令 使用指南
16 0
|
28天前
|
存储 算法 Shell
【Shell 命令集合 设备管理 】Linux 显示当前系统中定义的键盘映射表 dumpkeys命令 使用指南
【Shell 命令集合 设备管理 】Linux 显示当前系统中定义的键盘映射表 dumpkeys命令 使用指南
31 0