定时发送邮件

#### 1.新建shell脚本文件,执行MongoDB代码段,查看节点状态。 ``` #!/bin/sh BEGIN=$(date '+%Y-%m-%d %H:%M:%S') echo "begin [" $BEGIN " ] >>>" /home/mongo/mongodb/bin/mongo --host 127.0.0.1:23717 --authenticationDatabase admin -u dba -p jingzhongyue1 <<EOF[1] var members = rs.status().members var show = function(value,index,members){ print(value.stateStr); print("======"); if(value.stateStr === "SECONDARY"){ print("is secondary >>>> "); } else if(value.stateStr === "PRIMARY"){ print("is primary >>>> "); } else { print("unKnowStatus >>>> " + value.name); } } members.forEach(show) EOF echo "end [" $(date '+%Y-%m-%d %H:%M:%S') "] >>>" echo "==================== ****** ====================" ``` 进入Mongo节点,获取节点成员信息,遍历成员信息,获取节点状态字符串。判断字符串, 除了主节点和从节点外的所有状态信息,均表示为未知状态,将节点IP信息一并写到日志中。为发送邮件做准备。 #### 2.新建shell脚本,检索日志。 ``` #!/bin/bash #file name 分析检测日志 Analysis and detection log => asdl FILE=$(cat /root/logs/MongoStatusMonitoring.log | grep "unKnow") echo ${FILE} if [ -z "${FILE}" ][2] then echo "is null" else $(echo "${FILE}" | mail -s "mongodb" 200854453@qq.com); fi ``` 获取日志文件,并根据关键词检索文件。查找从所以带`unKnown`关键词的行。 判断是否为空,不为空,则发送邮件给运维人员。提醒运维人员进行节点维护。 #### 3.最后 ``` 0 0 * * * root /etc/Mongo_status_monitoring.sh >> /root/logs/MongoStatusMonitoring.log 2>&1 15 0 * * * root /etc/asdl.sh >> /root/logs/asdl.log 2>&1 ``` 将这两个文件加入到定时中,将时间错开,当前间隔为15分钟。 #### 注: [1]:`<<EOF`表示后面的代码段位持续输入,到再次出现`EOF`出结束,并且此结束符,必须单独一行。但是并不是必须使用`EOF`字样,这只是一个标识,可以自定义。但是开始可结束必须保持一致。 [2]:`[ -z "${FILE}" ]`判断FILE是否为空。 总结 -- 此处还有优化的空间,可以将两个shell脚本文件合并为一个。甚至不需要记录到日志文件中,再从日志中读取,再发送邮件。而且在检索日志文件的时候,也可以指定检索日期关键词后的一段,不必全文检索。但是时间不够了。后期有空再研究吧。