定时发送邮件
#### 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脚本文件合并为一个。甚至不需要记录到日志文件中,再从日志中读取,再发送邮件。而且在检索日志文件的时候,也可以指定检索日期关键词后的一段,不必全文检索。但是时间不够了。后期有空再研究吧。