Bash
1 前言
一个问题,一篇文章,一出故事。
今天遇到需要根据PostFix的特定邮箱地址触发一个电话报警,于是整理当前章节。
2 最佳实践
2.1 测试环境
2.2 部署监控脚本
2.2.1 创建脚本
vim ~/scripts/fireWarning.sh
加入如下配置,
#!/bin/bash
logFile="/var/log/maillog"
checkLog="/var/log/fireWarning.log"
searchString="will@cmdschool.org"
hostList="postfix01.cmdschool.org postfix02.cmdschool.org"
callUrl="http://phome.cmdschool.org/firealerts/call_api.php?userID=xxxx&password=xxxx&group=4&count=2&result=1&alert=will"
# 单服务器日志检索函数
# 参数:$1日志路径 $2检索关键词
getLogs() {
logFile="$1"
searchString="$2"
# 获取匹配的日志
grepLog=$(grep "$searchString" "$logFile")
echo "$grepLog"
}
# 检查是否有新的日志(主函数)
checkLogs() {
# 检查日志的标识
errorCounter=0
# 不存在去重日志则创建,创建失败则退出函数
if [ ! -f "$checkLog" ]; then
touch "$checkLog"
if [ $? -ne 0 ]; then
echo "Error creating log file $checkLog"
return 0
fi
fi
# 遍历所有服务器
getLog=""
for hostName in $hostList; do
ping -c 1 "$hostName" > /dev/null 2>&1
if [ $? -ne 0 ]; then
continue
fi
getLog="$getLog"$'\n'$(ssh "$hostName" "$(declare -f getLogs); getLogs $logFile $searchString")
done
# 无匹配日志,直接返回
if [ -z "$getLog" ]; then
return
fi
# 逐行检查返回日志是否是新日志
IFS=$'\n'
for errLog in $getLog; do
if grep -qF "$errLog" "$checkLog"; then
continue
fi
# 将新的日志写入检查日志
echo "$errLog" >> "$checkLog"
# 统计写入的日志的总数
errorCounter=$(($errorCounter + 1))
done
echo "$errorCounter"
}
# 如果没有返回新日志直接退出
errorCounter="$(checkLogs)"
if [ "$errorCounter" -eq "0" ]; then
exit
fi
# 触发电话接口
curl "$callUrl" > /dev/null 2>&1
2.2.2 测试脚本
bash ~/scripts/fireWarning.sh
2.2.3 设置脚本触发
crontab -e
加入如下设置,
*/1 * * * * bash ~/scripts/fireWarning.sh
没有评论