更新时间:2022-09-19 22:34:35
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 r 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,如需转载请自行联系原作者