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 ...
随机推荐
- Flutter移动电商实战 --(24)Provide状态管理基础
Flutter | 状态管理特别篇 —— Provide:https://juejin.im/post/5c6d4b52f265da2dc675b407?tdsourcetag=s_pcqq_aiom ...
- spring项目启动错误——java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
最近在搭spring项目框架的时候,遇到一个很伤的问题,翻了很多帖,都报告说什么少spring-context包啊之类的,但实际上spring的那些依赖我根本没漏,下面是我的pom: <depe ...
- 01背包---P2392 kkksc03考前临时抱佛脚
P2392 kkksc03考前临时抱佛脚 题解 01背包,类似于这道题,相似度99.999999%: 01-背包 P2663 越越的组队 一共有4科,每科的时间独立,然后每一科做一遍 P2663越 ...
- 001-多线程-JUC集合-框架概述
一.概述 1.1.java集合 java集合的架构,主体内容包括Collection集合和Map类:而Collection集合又可以划分为List(队列)和Set(集合). 1. List的实现类主要 ...
- 一百二十九:CMS系统之七牛云存储介绍和配置
将图片的存储.尺寸等图片本身的一些擦做,交给七牛云处理,自己只关注网站开发本身 七牛云官网:https://www.qiniu.com 操作 登录后,点击管理控制台 点击对象存储-->新建存储空 ...
- [译] NAT - 网络地址转换(2016)
[译] NAT - 网络地址转换(2016) Published at 2019-02-17 | Last Update 译者序 本文翻译自 2016 年的一篇英文博客 NAT - Network A ...
- 用于Python文件转换.exe文件的pyinstaller工具安装
安装方法: 注:python环境一定要配置好. 1.第一步:下载 官方网站:http://www.pyinstaller.org/downloads.html 此处下载版本为稳定版. 2.第二步:下载 ...
- Anaconda中安装Cascade RCNN(Detectron)的若干问题
安装参考https://github.com/zhaoweicai/Detectron-Cascade-RCNN/blob/master/INSTALL.md 1.对于在 python detectr ...
- JDK1.8新特性之Optional
概念 Optional 是JDK1.8中出现的一个容器类,代表一个值存在或者不存在.原来使用null表示一个值不存在,现在Optional可以更好的表达这个概念.并且可以避免空指针异常. 场景分析 需 ...
- libvirt2.0安装
目录 1.libvirt介绍 2.卸载系统自带的libvirt 2.1.查看当前安装的libvirt相关包 2.2.全部卸载掉 3.使用tar包编译安装 3.1.解压缩 3.2.生成Makefile文 ...