linux脚本监控应用且通过邮件报警异常
一、背景
最近接到监控应用并通过邮件报警的任务,由于需求比较简单,故没有使用springboot那套,而是采用linux脚本的方式进行监控。
二、思路
通过linux自带的定时功能,定时执行一个linux脚本,通过脚本访问应用的接口,若接口不通,进行重试,达到一定重试次数则重启tomcat并发送告警邮件。若无法重启tomcat,则重试,达到一定次数停止重启并发送告警邮件。
三、安装sendmail并配置sendmail
在安装配置sendmail的时候遇到不少坑,在配置sendmail的时候,需要修改/etc/mail/sendmail.mc文件和/etc/mail.rc文件,网上很多博客都是配置了其中一个,导致无法发送邮件成功,因此在配置的时候需要特别注意。具体的
脚本文件如下,将发送邮箱等信息改成自己的,直接放到linux服务器(centos)执行该脚本文件即可安装且配置完成.
#! /bin/bash # 发送邮箱
$from=$1
# 协议
$smtp=$2
# 发送用户,一般与发送邮箱一致
$user=$3
# 授权码(非邮箱密码)
$password=$4 # 安装sendmail
yum install -y sendmail
yum install -y sendmail-cf # 安装salauthd
# 使用smtp认证,需要安装saslauthd
yum install -y saslauthd # 启动saslauthd服务
service saslauthd start # 设置saslauthd开机自动启动
chkconfig saslauthd on # 安装perl,不然无法使用下面的命令查找文件内容并替换
yum install -y perl perl-devel # 安装mailx
yum install -y mailx # 配置sendmail
# 设置外网可访问
# 实际是将DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl 替换成 DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
find /etc/mail -name 'sendmail.mc' | xargs perl -pi -e 's|Addr=127.0.0.1|Addr=0.0.0.0|g' # 设置发送邮箱相关信息
echo "set ssl-verify=ignore">>/etc/mail.rc
echo "set nss-config-dir=/etc/pki/nssdb">>/etc/mail.rc
# 发送邮箱
echo "set from=$from">>/etc/mail.rc
# 协议
echo "set smtp=$smtp">>/etc/mail.rc
# 发送邮箱用户,一般与发送邮箱一致
echo "set smtp-auth-user=$user">>/etc/mail.rc
# 授权码(非邮箱密码)
echo "set smtp-auth-password=$password">>/etc/mail.rc
echo "set smtp-auth=login">>/etc/mail.rc # sendmail开机启动
chkconfig sendmail on # 启动sendmail
service sendmail start
四、编写监控脚本
该脚本用来访问应用接口,以此来确定应用是否正常,并通过sendMail发送异常邮件。具体逻辑如下脚本
#! /bin/bash # tomcat启动脚本
startTomcat=$ # 日志地址
tomcatMonitorLog=$ # 邮件地址,多个逗号隔开
email_address=$ # 请求接口
webUrl=$ # 重试次数
retryCount=$ # 最大重启次数
maxRestartCount=$ # 计数器文件位置
restartCountTxt=$ # tomcat停止脚本
stopTomcat=$ # 判断容器是否存在的脚本
isExist=$ # 用来计数重启tomcat的次数
restartCount= # 正确的请求返回值
statusCode= time=$(date "+%Y-%m-%d %H:%M:%S")
echo "=======================$time=======================">>$tomcatMonitorLog # 日志输出
if [ -f $tomcatMonitorLog ]; then
echo "日志文件已创建">>$tomcatMonitorLog
else
echo "日志文件未创建,马上创建">>$tomcatMonitorLog
touch $tomcatMonitorLog
fi # 初始化计数器
if [ -f $restartCountTxt ]; then
while read line
do
restartCount=$((line))
done < $restartCountTxt
else
touch $restartCountTxt
echo "" > $restartCountTxt
fi # 判断是否已达到最大重启次数
if [[ "$restartCount" -eq "$maxRestartCount" ]]; then
tomcatServiceCodeTry=$(curl -s -m -o /dev/null --connect-timeout $webUrl -w %{http_code}) # 重置重启计数器(因手动重启应用而没有重置计数器)
if [[ "$tomcatServiceCodeTry" -eq "$statusCode" ]]; then
echo '【info】tomcat运行正常,访问系统接口正常,重置计数器'>>$tomcatMonitorLog
true > $restartCountTxt
echo "" > $restartCountTxt
exit
else
echo "已超过最大重启次数,不再自动重启">>$tomcatMonitorLog
echo '已超过最大重启次数,不再自动重启,请手动重启' | mail -v -s '系统告警' $email_address
true > $restartCountTxt
count=$[restartCount+]
echo $count > $restartCountTxt
exit
fi
fi
if [[ "$restartCount" -ge "$maxRestartCount" ]]; then
tomcatServiceCodeTry=$(curl -s -m -o /dev/null --connect-timeout $webUrl -w %{http_code})
# 重置重启计数器(因手动重启应用而没有重置机器)
if [[ "$tomcatServiceCodeTry" -eq "$statusCode" ]]; then
echo '【info】tomcat运行正常,访问系统接口正常,重置计数器'>>$tomcatMonitorLog
true > $restartCountTxt
echo "" > $restartCountTxt
exit
else
echo "已超过最大重启次数,不再自动重启">>$tomcatMonitorLog
exit
fi
fi # 获取tomcat进程id
tomcatId=$($isExist)
# 重启
function restart() {
if [ -n "$tomcatId" ]; then
echo "tomcat开始关闭"
$stopTomcat
fi
sleep
# 循环100次,直到进程已经被关闭,否则认为关闭不成功,主动关闭进程
for((i=;i<;i++));
do
tomcatId=$($isExist)
if [ -n "$tomcatId" ]; then
sleep
echo "tomcat还没关闭,继续阻塞等待关闭完成"
else
break
fi
done
echo 'tomcat开始重启...'
$startTomcat # 启动tomcat
} # 监控服务是否正常
function monitor() { # 判断tomcat进程是否存在
if [ -n "$tomcatId" ]; then
tomcatServiceCodeTry=$(curl -s -m -o /dev/null --connect-timeout $webUrl -w %{http_code})
if [[ "$tomcatServiceCodeTry" -eq "$statusCode" ]]; then
echo '【info】tomcat运行正常,访问系统接口正常......'
true > $restartCountTxt
echo "" > $restartCountTxt
exit
else
sleep
for((i=;i<$retryCount;i++))
do
tomcatServiceCodeTry=$(curl -s -m -o /dev/null --connect-timeout $webUrl -w %{http_code})
if [[ "$tomcatServiceCodeTry" -eq "$statusCode" ]]; then
echo '【info】tomcat运行正常,访问系统接口正常......'
true > $restartCountTxt
echo "" > $restartCountTxt
echo "执行完成"
exit
else
echo '【error】重新访问系统接口失败'
sleep
fi
done
echo '【error】访问系统接口出错,请注意......开始重启tomcat'
echo '【error】发送告警邮件'
echo '【info】由于访问系统接口出错,tomcat开始自动重启'
true > $restartCountTxt
count=$[restartCount+]
echo $count > $restartCountTxt
# 发送告警邮件
echo "由于访问系统接口出错,tomcat开始自动重启,地址:$webUrl" | mail -v -s "系统告警" $email_address
restart # 重启
fi
else
echo '【error】tomcat进程不存在!tomcat开始自动重启...'
echo '【error】$startTomcat,请稍候......'
echo '【error】发送告警邮件'
echo "由于tomcat没有启动,tomcat开始自动重启,地址:$webUrl" | mail -v -s "系统告警" $email_address
true > $restartCountTxt
count=$[restartCount+]
echo $count > $restartCountTxt
restart # 重启
fi
}
monitor>>$tomcatMonitorLog
五、添加定时器
首先编写一个脚本,用来存放初始化信息,如启动tomcat的命令、日志地址、邮件地址、访问接口、重试次数、停止tomcat命令等,具体如下
#! /bin/bash # tomcat启动脚本
startTomcat=/usr/local/apache-tomcat-7.0./bin/startup.sh # 日志地址
tomcatMonitorLog=/usr/local/monitorApplication.log # 邮件地址,多个逗号隔开
email_address=你的发送邮箱地址 # 请求接口
webUrl=你的应用接口 # 重试次数,每次间隔30秒
retryCount= # 最大重启次数
maxRestartCount= # 计数器文件位置
restartCountTxt=/usr/local/restartCountTxt.txt # tomcat停止脚本
stopTomcat=/usr/local/kill.sh # 判断容器是否存在的脚本
isExist=/usr/local/isExistTomcat.sh # 执行监控脚本
monitorApplicationProcessId=$(ps -ef |grep monitorApplication |grep -w /usr/local |grep -v 'grep'|awk '{print $2}')
if [[ $monitorApplicationProcessId ]]; then
time=$(date "+%Y-%m-%d %H:%M:%S")
echo "=======================$time=======================">>$tomcatMonitorLog
echo "monitorApplication.sh脚本正在试行,此次定时任务不执行该脚本,直接退出,等待下一次定时任务">>$tomcatMonitorLog
exit
else
sh /usr/local/monitorApplication.sh $startTomcat $tomcatMonitorLog $email_address $webUrl $retryCount $maxRestartCount $restartCountTxt "$stopTomcat" "$isExist"
fi
其次,定义一个定时器,使用crontab -e命令,插入以下代码,表示一分钟执行一次check.sh脚本
*/ * * * * /usr/local/check.sh
到此,定时监控应用的脚本就完成了。
参考博客:https://blog.csdn.net/thinkthewill/article/details/80868442
所有脚本github地址:https://github.com/1053531172/monitorApplication
linux脚本监控应用且通过邮件报警异常的更多相关文章
- linux shell脚本检测硬盘磁盘空间 邮件报警
使用 http://www.weiruoyu.cn/?p=368 shell脚本监控硬盘空间剩余空间 邮件报警 1.先观察一下磁盘,和如何使用脚本 [root@localhost ~]# df -h ...
- Shell脚本监控专线Network并SendEmail报警
Much effort, much prosperity. 配置服务器监控专线网络 项目介绍: 配置一台服务器监控专线网络的情况,(由于公司业务的原因需要用到专线进行与客户对接)实时监控专线的状态,如 ...
- 使用Grafana 展示Docker容器的监控图表并设置邮件报警规则
一.Docker 容器监控报警方式 接着上篇文章的记录,看到grafana的版本已经更新到4.2了,并且在4.0以后的版本中,加入了Alert Notifications 功能,这样在对容器 监控完, ...
- linux如何使用QQmail实现网络邮件报警?
环境:CentOS7 目的:考虑到实现服务的高可用性.使用电子邮件通知服务,可以快速的通知维护人员.提高服务的可靠性,而通过 smtp.qq.com 实现脚本邮件报警 一.设置并取得 smtp.qq. ...
- Zabbix 监控端口状态并邮件报警
Zabbix监控端口 前提 zabbix安装 zabbix邮件报警 添加监控项 添加触发器 添加动作 设置完成后,在配置过报警媒介后也就是 邮件报警 后就完成了.
- 【Linux】结合Python 简易实现监控公司网站,邮件发送异常
背景 由于一些原因,博主负责测试的网站的服务器切换到了香港,切换后出现了多次访问超时的情况 于是主动请缨写一个自动监测的脚本,本来准备完全使用shell来写,后来发现shell发送邮件只能在测试机之间 ...
- zabbix3.4 实现sendEmail邮件报警
zabbix3.4实现sendEmail邮件报警 转发:https://www.cnblogs.com/pythonal/p/7813948.html sendEmail是一个轻量级,命令行的SMTP ...
- zabbix(7)邮件报警配置
邮件报警可以使用Linux自带邮件服务器(postfix等),也可以使用其他邮件服务器(像腾讯邮箱,126邮箱) 一.使用mail. 1.确定zabbix server是否安装发送邮件的命令mail, ...
- 【Linux】Zabbix + MPM + msmtp + mutt 监控MySQL + 邮件报警
Zabbix部署参考博文 http://blog.sina.com.cn/s/blog_5611597901017oe0.html MPM安装配置参考博文和MPM官网下载地址 http://blog ...
随机推荐
- sqli-labs通关记录
环境搭建:https://www.cnblogs.com/kagari/p/11910749.html 总体感受:sqli-labs还是只适合入门 在此基础上添加了一个flag数据库,库名flag,表 ...
- java课后实验性问题2
课后作业一:计算组合数 程序设计思想: 从键盘获取组合数,判断是否构成组合数.分别用三种方法计算组合数输出. 程序流程图: import java.util.Scanner; public class ...
- mvc partialView断点调试问题
mvc中的partialview 在前端f12调试时,默认看不到代码的. 在Js中加上debugger; 调试时会走到断点,多出个VM打头的局部视图页面.
- golang list使用 双层 循环 删除 遍历
queue队列: import ( "container/list" "sync" ) type Queue struct { l *list.List m s ...
- python笔记4 内置函数,匿名函数.递归函数 面向对象(基础, 组合,继承)
内置函数 eval和exec eval :执行字符串中的代码并将结果返回给执行者,有返回值 exec:执行字符串中的代码,往往用于执行流程语句,没有返回值. s1 = '1+2' s2 = 'prin ...
- Excel转html工具类
有时需要将Excel展示在页面上,所以需要将Excel转化为html,这里封装一个工具类. Excel和servlet访问效果如下图示: 工具类代码: POIReadExcelToHtmlUtil.j ...
- unity读取灰度图生成等值线图
准备灰度图 grayTest.png,放置于Assets下StreamingAssets文件夹中. 在场景中添加RawImage用于显示最后的等值线图. 生成等值线的过程,使用Marching ...
- NDK学习笔记-gdb调试
在做开发的时候,难免会crash,那么在这时候需要进行调试,在C/C++的代码调试中,gdb是很常用的gdb在这不做过多介绍,之前在C语言中已经做过总结,这里简要回顾一下 要使用gdb,在编译的时候需 ...
- js 数组遍历 对象遍历
一.数组遍历 1,普通for循环,经常用的数组遍历 var arr = [1,2,0,3,9]; for ( var i = 0; i <arr.length; i++){ console.lo ...
- vue 解决jsonp跨域
在Vue中使用jsonp 参考链接:https://blog.csdn.net/m0_38134431/article/details/87930647 在vue中使用vue-jsonp 参考链接:h ...