7月17日任务
20.20 告警系统主脚本
20.21 告警系统配置文件
20.22 告警系统监控项目
先创建各级目录如下图
在bin下创建并编辑脚本main,具体内容如下图所示:
export send=1(设置总开关,如果遇到维护状态可以关闭告警邮件开关,设置成0)
export addr:输入每台服务器的IP地址(为了告诉我们发邮件的是那一机器,由于是分布式的系统, 不需要服务端, 每台机器独立运行)
dir=`pwd`定义当前路径 (方便挪用到其他机器的其他文件夹里)
last_dir:定义最后一级目录(即/usr/local/sbin/mon/bin目录)echo $dir |awk -F '/' '{print $NF}';注意需要加反引号,代表是解释器中需要执行的命令
下面判断当前是否在bin目录中,因为很多命令都是调用相对路径,只有在同级目录才不会报错,bin,mail,等目录都是相互关联的;否则提示需要该路径,直接退出脚本exit;当在bin目录下时conf_file=../conf/mon.conf;因为需要到上一级目录mon下的conf文件夹中
再定义正确和错误的log目录:exec 1>>../log/mon.log 2>>../log/err.log并加一个时间标记 echo "`date +"%F %T"` load average"
由于load基本上是每台机器必监控的脚本,一般情况下不需要加开关;故直接在主脚本中调用子脚本,用法:/bin/bash ../shares/load.sh
最后查看配置文件中的项目,遍历一遍,如在配置文件中查看是否需要监测502(nginx中的一个状态码)(通过正则表达式把是否相关的开关过滤出来,如果是则执行,否则不执行)
1 shell 中的exec用法
在shell脚本中使用exec命令,根据操作的对象不同会有不同的行为
1 操纵文件描述符
这里面又要说说描述符 shell中有12个描述符
其中 0 代表标准输入
1 代表标准输出
2 错误
其他 3-9 都是空白描述符
告警系统文件配置cd mon/conf/mon.conf
其中502监控需要调用状态码,所以必须定义访问日志的路径,回到主配置文件中监控502,用正则做一个过滤,如果发现需要监控,则需要找到log路径;最后执行shares下的502脚本
告警系统监控项目
cd ../shares ①定义Load.sh
当满足load条件且send为1,则执行发邮件通知如上图所示,创建为/log/load.tmp,发邮件时会用到;如果Load不足,则直接记录一条日志
②502.sh
③disk.sh
awk支持在一段字符串里使用多个分隔符进行分割
如果把LANG=en则,不会出现中文的已用字眼,如下图
在数字大于90并且需要发送时把log写入/log/disk.tmp下;同时做一个判断,如果该文件存在,则发邮件;否则直接打印出磁盘空间是否不足,并附带时间