1 2 3 4 5 6 7 | 需求:使用shell定制各种个性化告警工具,但需要统一化管理、规范化管理。 思路:指定一个脚本包,包含主程序、子程序、配置文件、邮件引擎、输出日志等。 主程序:作为整个脚本的入口,是整个系统的命脉。 配置文件:是一个控制中心,用它来开关各个子程序,指定各个相关联的日志文件。 子程序:这个才是真正的监控脚本,用来监控各个指标。 邮件引擎:是由一个python程序来实现,它可以定义发邮件的服务器、发邮件人以及发件人密码 输出日志:整个监控系统要有日志输出。 |
要求
1 | 我们的机器角色多种多样,但是所有机器上都要部署同样的监控系统,也就说所有机器不管什么角色,整个程序框架都是一致的,不同的地方在于根据不同的角色,定制不同的配置文件。 |
程序框架
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/bin/bash # 是否发送邮件的开关 export send=1 # 过滤ip地址 export addr=` /sbin/ifconfig | grep -A1 "eno16777736" | 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 |
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 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 logfile= /data/log/xxx .xxx.com /access .log ## request_count 定义日志路径以及域名 to_mon_request_count=0 req_log= /data/log/www .discuz.net /access .log domainname=www.discuz.net |
1 2 3 4 5 6 7 8 9 | [root@localhost shares] # cat load.sh #! /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 aming_test@163.com "$addr\_load:$load" ` cat .. /log/load .tmp` fi echo "`date +%T` load is $load" |
1 2 3 4 5 6 7 8 9 | [root@localhost shares] # cat 502.sh #! /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" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@localhost shares] # cat disk.sh #! /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 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 done |
联系客服