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 ...
随机推荐
- 解决python 保存json到文件时 中文显示16进制编码的问题
python 2.7 import codecs import json with codecs.open('Options.json', 'w', encoding='utf-8') as f: j ...
- CodeWar打怪升级-Python篇
1. The goal of this exercise is to convert a string to a new string where each character in the new ...
- SQL-W3School-高级:SQL CREATE TABLE 语句
ylbtech-SQL-W3School-高级:SQL CREATE TABLE 语句 1.返回顶部 1. CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL ...
- 自己写了个简单的redis分布式锁【我】
自己写了个简单的redis分布式锁 [注意:此锁需要在每次使用前都创建对象,也就是要在线程内每次都创建对象后使用] package redis; import java.util.Collection ...
- gateway启动报错:org.springframework.cloud.gateway.config.GatewayAutoConfiguration required a bean of type 'org.springframework.http.codec.ServerCodecConfigurer' that could not be found
将pom.xml中关于spring-boot-start-web模块的jar依赖去掉. 错误分析: 根据上面描述(Description)中信息了解到GatewayAutoConfiguration这 ...
- 自然语言处理(NLP)之个人小结
一 概述 1.1 自然语言处理四大任务 序列标注 分词 词性标注 命名实体识别 分类任务 文本分类 情感分析 判断句子关系 问答系统 对话系统 阅读理解 生成任务 机器翻译 自动文摘 图像描述生成 1 ...
- [Graphics] UIColor created with component values far outside the expected range, Set a breakpoint on UIColorBreakForOutOfRangeColorComponents to debug. This message will only be logged once.
用了别人的代码,一直总有一个报错,一开始没注意,最近项目快完期了,得处理下警告之类的东西, 后面发现之前那个大神代码是这样写的 [SVProgressHUD setBackgroundColor:[U ...
- MVVM的项目学习和笔记
今天在学习一个用MVVM模式写的项目,掌握一下对MVVM的理解和记的一些笔记. 下面是自己学习的项目链接: http://www.code4app.com/ios/一个MVVM架构的iOS工程/695 ...
- CG-CTF 南邮 综合题2
个人网站 http://www.wjlshare.tk 0x00前言 主要考了三块 第一块是文件包含获取源码 第二块是通过sql绕过注入获取密码 第三块是三参数回调后门的利用 做这题的时候结合了别人的 ...
- 【编程开发】加密算法(MD5,RSA,DES)的解析
MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展而来. MD5将 ...