一、背景  

  最近接到监控应用并通过邮件报警的任务,由于需求比较简单,故没有使用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脚本监控应用且通过邮件报警异常的更多相关文章

  1. linux shell脚本检测硬盘磁盘空间 邮件报警

    使用 http://www.weiruoyu.cn/?p=368 shell脚本监控硬盘空间剩余空间 邮件报警 1.先观察一下磁盘,和如何使用脚本 [root@localhost ~]# df -h ...

  2. Shell脚本监控专线Network并SendEmail报警

    Much effort, much prosperity. 配置服务器监控专线网络 项目介绍: 配置一台服务器监控专线网络的情况,(由于公司业务的原因需要用到专线进行与客户对接)实时监控专线的状态,如 ...

  3. 使用Grafana 展示Docker容器的监控图表并设置邮件报警规则

    一.Docker 容器监控报警方式 接着上篇文章的记录,看到grafana的版本已经更新到4.2了,并且在4.0以后的版本中,加入了Alert Notifications 功能,这样在对容器 监控完, ...

  4. linux如何使用QQmail实现网络邮件报警?

    环境:CentOS7 目的:考虑到实现服务的高可用性.使用电子邮件通知服务,可以快速的通知维护人员.提高服务的可靠性,而通过 smtp.qq.com 实现脚本邮件报警 一.设置并取得 smtp.qq. ...

  5. Zabbix 监控端口状态并邮件报警

    Zabbix监控端口 前提 zabbix安装 zabbix邮件报警 添加监控项 添加触发器 添加动作 设置完成后,在配置过报警媒介后也就是 邮件报警  后就完成了.

  6. 【Linux】结合Python 简易实现监控公司网站,邮件发送异常

    背景 由于一些原因,博主负责测试的网站的服务器切换到了香港,切换后出现了多次访问超时的情况 于是主动请缨写一个自动监测的脚本,本来准备完全使用shell来写,后来发现shell发送邮件只能在测试机之间 ...

  7. zabbix3.4 实现sendEmail邮件报警

    zabbix3.4实现sendEmail邮件报警 转发:https://www.cnblogs.com/pythonal/p/7813948.html sendEmail是一个轻量级,命令行的SMTP ...

  8. zabbix(7)邮件报警配置

    邮件报警可以使用Linux自带邮件服务器(postfix等),也可以使用其他邮件服务器(像腾讯邮箱,126邮箱) 一.使用mail. 1.确定zabbix server是否安装发送邮件的命令mail, ...

  9. 【Linux】Zabbix + MPM + msmtp + mutt 监控MySQL + 邮件报警

    Zabbix部署参考博文 http://blog.sina.com.cn/s/blog_5611597901017oe0.html  MPM安装配置参考博文和MPM官网下载地址 http://blog ...

随机推荐

  1. python笔记2小数据池,深浅copy,文件操作及函数初级

    小数据池就是在内存中已经开辟了一些特定的数据,经一些变量名直接指向这个内存,多个变量间公用一个内存的数据. int: -5 ~ 256 范围之内 str: 满足一定得规则的字符串. 小数据池: 1,节 ...

  2. PS改变图片像素大小(一寸照片变二寸)

    1.打开Photoshop,点击“文件”菜单,选择“打开”,将要处理的图片加载进来 2.找到“图像”菜单,选择“图像大小”,我们在这里对图片进行处理. 3.根据需要对其分辨率或者尺寸进行设置,设置好后 ...

  3. 【ARTS】01_27_左耳听风-201900513~201900519

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  4. swift 第十四课 可视化view: @IBDesignable 、@IBInspectable

    以前应objctiew-c 写项目的时候,就知道有这两个关键字,现在用swift了.用法稍作改变,基本用法还是一致的 虽然使用这个之后,有时候会报错的非常的莫名其妙----(其实还是自己技术不够牛…… ...

  5. celery监控工具flower

    特性 用Celery事件实时监控 任务进程和历史 能够显示任务的详细信息(arguments, start time, runtime等) 图形化和统计 远程控制 查看worker状态和统计 关闭和重 ...

  6. [Paper Reading] Show and Tell: A Neural Image Caption Generator

    论文链接:https://arxiv.org/pdf/1411.4555.pdf 代码链接:https://github.com/karpathy/neuraltalk & https://g ...

  7. L1不可导的时候该怎么办

    坐标轴下降法 比较浅显的解释: 坐标轴下降法(解决L1正则化不可导的问题) 以代码进行简单入门的博客(演示的代价函数是可导的): Coordinate descent in Python Introd ...

  8. python 3 获取本机公网ip的几种方法

    参考博客:https://blog.csdn.net/conquerwave/article/details/77666226 from urllib.request import urlopen f ...

  9. centOS 安装 pm2

    安装 npm install -g pm2 自启 pm2 startup centos 启动 pm2 start server/add.js (以实际路径为准) 其他命令: pm2 list #查看进 ...

  10. flask核心对象

    appcontext 上下文 处理