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,如需转载请自行联系原作者