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 ...
随机推荐
- git clone速度太慢解决方案
原文地址:https://blog.csdn.net/hzwwpgmwy/article/details/79043251 适用各种操作系统,本次测试于ubuntu,下载速度从二十几k提高到二百多k ...
- hive进阶 技巧
1.日期格式转换(将yyyymmdd转换为yyyy-mm-dd) select from_unixtime(unix_timestamp('20180905','yyyymmdd'),'yyyy-mm ...
- Java使用jxl写入Excel文件
首先添加jxl的maven依赖: <!-- https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl --> < ...
- 【leetcode_easy】551. Student Attendance Record I
problem 551. Student Attendance Record I 题意: solution: class Solution { public: bool checkRecord(str ...
- 【leetcode_easy】541. Reverse String II
problem 541. Reverse String II 题意: 给定一个字符串,每隔k个字符翻转这k个字符,剩余的小于k个则全部翻转,否则还是只翻转剩余的前k个字符. solution1: cl ...
- WordPress自定义菜单和修改去除多余的css
这里主要是用于模板制作的,一般前端已经写好了,我们只要将前端的内容套用WordPress后台就可以了. 所以我们在模板制作过程中,需要自定义WordPress菜单. 在functions.php文件中 ...
- The input file should be UTF8 without a byte-order-mark(BOM)
byte-order-mark = (BOM) 在unicode诸编码中,字节顺序标记-BOM被用于标记编码高低位的顺序. .BOM是一个特殊的unicode字符.早期标准定义其为“零长度.非断行的空 ...
- 二分类Logistic回归模型
Logistic回归属于概率型的非线性回归,分为二分类和多分类的回归模型.这里只讲二分类. 对于二分类的Logistic回归,因变量y只有“是.否”两个取值,记为1和0.这种值为0/1的二值品质型变量 ...
- webdriervAPI(定位一组元素)
通过定位一组元素的方法来,来勾选自己需要勾选的选项. from selenium import webdriver from selenium.common.exceptions import NoS ...
- jmeter操作—从redis中获取token
嗨,大家好,我是叶子 背景:某APP项目中需要进行各接口的性能测试,比如:测试商品的搜索功能.店铺查询功能等接口,测试时需要保持登录状态,所以需要获取到登录账号的token,方便之后的接口测试. 准备 ...