2018.10.23日,预习笔记,shell编程(告警系统)

笔记目录

  1. shell中的函数
  2. shell中的数组
  3. 告警系统需求分析
  4. 告警系统主脚本
  5. 告警系统配置文件
  6. 告警系统监控项目
  7. 告警系统邮件引擎
  8. 运行告警系统

 

一.shell中的函数

2018.10.23日,预习笔记,shell编程(告警系统)_第1张图片

  • 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。
  • 格式: function f_name() {                command          } 函数必须要放在最前面
  • 示例1

#!/bin/bash

input() 定义函数

{    

echo $1 $2 $# $0

}

input 1 a b

  • 示例二

2018.10.23日,预习笔记,shell编程(告警系统)_第2张图片

执行结果:

2018.10.23日,预习笔记,shell编程(告警系统)_第3张图片

  • 示例三

#!/bin/bash

sum() {    定义函数

s=$[$1+$2]    s等于两个函数相加

echo $s 打印函数s

}

sum 1 2   

  • 示例四

#!/bin/bash

ip() {    定义函数

ifconfig |grep -A1 "$1:  " |tail -1 |awk '{print $2}'|awk -F':' '{print $2}' } 截取网卡段落ip数字

read -p "Please input the eth name: " e 请输入网卡名字

myip=`ip $e`

echo "$e address is $myip"

 

二.shell中的数组

2018.10.23日,预习笔记,shell编程(告警系统)_第4张图片

  • 定义数组 a=(1 2 3 4 5); echo ${a[@]}  
  • echo ${#a[@]} 获取数组的元素个数  
  • echo ${a[2]} 读取第三个元素,数组从0开始  
  • echo ${a[*]} 等同于 ${a[@]}  显示整个数组  
  • 数组赋值  
  • a[1]=100; echo ${a[@]}  
  • a[5]=2; echo ${a[@]} 如果下标不存在则会自动添加一个元素  
  • 数组的删除  
  • uset a; unset a[1]
  • 数字是从0开始的,0就是下标1
  • 数组分片
  •  a=(`seq 1 5`)  
  • echo ${a[@]:0:3} 从第一个元素开始,截取3个  
  • echo ${a[@]:1:4} 从第二个元素开始,截取4个  
  • echo ${a[@]:0-3:2} 从倒数第3个元素开始,截取2个  
  • 数组替换  
  • echo ${a[@]/3/100}  
  • a=(${a[@]/3/100})

 

三.告警系统需求分析

2018.10.23日,预习笔记,shell编程(告警系统)_第5张图片

  • 需求:使用shell定制各种个性化告警工具,但需要统一化管理、规范化管理。  
  • 思路:指定一个脚本包,包含主程序、子程序、配置文件、邮件引擎、输出日志等。  
  • 主程序:作为整个脚本的入口,是整个系统的命脉。  
  • 配置文件:是一个控制中心,用它来开关各个子程序,指定各个相关联的日志文件。  
  • 子程序:这个才是真正的监控脚本,用来监控各个指标。  
  • 邮件引擎:是由一个python程序来实现,它可以定义发邮件的服务器、发邮件人以及发件人密码  
  • 输出日志:整个监控系统要有日志输出。
  • 要求:我们的机器角色多种多样,但是所有机器上都要部署同样的监控系统,也就说所有机器不管什么角色,整个程序框架都是一致的,不同的地方在于根据不同的角色,定制不同的配置文件。  
  • 程序架构:                                    
  •                            (主目录 mon)        

                  ________________|_______________________________          

              |                |                  |                         |                      |          

           bin            conf         shares                   mail                  log          

             |               |                     |                       |                         |      

    [main.sh] [ mon.conf] [load.sh 502.sh] [mail.py mail.sh] [ mon.log err.log ]

  • bin下是主程序
  • conf下是配置文件
  • shares下是各个监控脚本
  • mail下是邮件引擎
  • log下是日志。

 

四.告警系统主脚本

 

  • main.sh主脚本内容  

#!/bin/bash

#Written by aming.

# 是否发送邮件的开关

export send=1

# 过滤ip地址

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配置文件内容  

## 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

 

 

 

 

 

 

六.告警系统监控项目

  • 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" ]

then    

echo "$addr `date +%T` load is $load" >../log/load.tmp    

/bin/bash ../mail/mail.sh [email protected] "$addr\_load:$load"

`cat ../log/load.tmp`

fi

echo "`date +%T` load is $load"

  • 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"

  • disk.sh脚本内容

#! /bin/bash

##Writen by aming##

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

七.告警系统邮件引擎

  • mail.sh内容 //其中mail.py内容到这里下载https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py  

log=$1

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]

echo $v if [ $v -gt 3600 ]

then    

./mail.py  $1  $2  $3    

echo "0" > /tmp/$log.txt

else    

if [ ! -f /tmp/$log.txt ]    

then        

echo "0" > /tmp/$log.txt    

fi    

nu=`cat /tmp/$log.txt`    

nu2=$[$nu+1]    

echo $nu2>/tmp/$log.txt    

if [ $nu2 -gt 10 ]    

then          

./mail.py  $1 "trouble continue 10 min $2" "$3"          

echo "0" > /tmp/$log.txt    

fi

fi

 

八.运行告警系统

2018.10.23日,预习笔记,shell编程(告警系统)_第6张图片

 

 

 

转载于:https://my.oschina.net/u/3912766/blog/2252621

你可能感兴趣的:(2018.10.23日,预习笔记,shell编程(告警系统))