linux脚本监控应用且通过邮件报警异常
一、背景
最近接到监控应用并通过邮件报警的任务,由于需求比较简单,故没有使用springboot那套,而是采用linux脚本的方式进行监控。
二、思路
通过linux自带的定时功能,定时执行一个linux脚本,通过脚本访问应用的接口,若接口不通,进行重试,达到一定重试次数则重启tomcat并发送告警邮件。若无法重启tomcat,则重试,达到一定次数停止重启并发送告警邮件。
三、安装sendmail并配置sendmail
在安装配置sendmail的时候遇到不少坑,在配置sendmail的时候,需要修改/etc/mail/sendmail.mc文件和/etc/mail.rc文件,网上很多博客都是配置了其中一个,导致无法发送邮件成功,因此在配置的时候需要特别注意。具体的
脚本文件如下,将发送邮箱等信息改成自己的,直接放到linux服务器(centos)执行该脚本文件即可安装且配置完成.
1 #! /bin/bash 2 3 # 发送邮箱 4 $from=$1 5 # 协议 6 $smtp=$2 7 # 发送用户,一般与发送邮箱一致 8 $user=$3 9 # 授权码(非邮箱密码) 10 $password=$4 11 12 # 安装sendmail 13 yum install -y sendmail 14 yum install -y sendmail-cf 15 16 # 安装salauthd 17 # 使用smtp认证,需要安装saslauthd 18 yum install -y saslauthd 19 20 # 启动saslauthd服务 21 service saslauthd start 22 23 # 设置saslauthd开机自动启动 24 chkconfig saslauthd on 25 26 # 安装perl,不然无法使用下面的命令查找文件内容并替换 27 yum install -y perl perl-devel 28 29 # 安装mailx 30 yum install -y mailx 31 32 # 配置sendmail 33 # 设置外网可访问 34 # 实际是将DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl 替换成 DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl 35 find /etc/mail -name 'sendmail.mc' | xargs perl -pi -e 's|Addr=127.0.0.1|Addr=0.0.0.0|g' 36 37 # 设置发送邮箱相关信息 38 echo "set ssl-verify=ignore">>/etc/mail.rc 39 echo "set nss-config-dir=/etc/pki/nssdb">>/etc/mail.rc 40 # 发送邮箱 41 echo "set from=$from">>/etc/mail.rc 42 # 协议 43 echo "set smtp=$smtp">>/etc/mail.rc 44 # 发送邮箱用户,一般与发送邮箱一致 45 echo "set smtp-auth-user=$user">>/etc/mail.rc 46 # 授权码(非邮箱密码) 47 echo "set smtp-auth-password=$password">>/etc/mail.rc 48 echo "set smtp-auth=login">>/etc/mail.rc 49 50 # sendmail开机启动 51 chkconfig sendmail on 52 53 # 启动sendmail 54 service sendmail start
四、编写监控脚本
该脚本用来访问应用接口,以此来确定应用是否正常,并通过sendMail发送异常邮件。具体逻辑如下脚本
1 #! /bin/bash 2 3 # tomcat启动脚本 4 startTomcat=$1 5 6 # 日志地址 7 tomcatMonitorLog=$2 8 9 # 邮件地址,多个逗号隔开 10 email_address=$3 11 12 # 请求接口 13 webUrl=$4 14 15 # 重试次数 16 retryCount=$5 17 18 # 最大重启次数 19 maxRestartCount=$6 20 21 # 计数器文件位置 22 restartCountTxt=$7 23 24 # tomcat停止脚本 25 stopTomcat=$8 26 27 # 判断容器是否存在的脚本 28 isExist=$9 29 30 # 用来计数重启tomcat的次数 31 restartCount=0 32 33 # 正确的请求返回值 34 statusCode=200 35 36 time=$(date "+%Y-%m-%d %H:%M:%S") 37 echo "=======================$time=======================">>$tomcatMonitorLog 38 39 # 日志输出 40 if [ -f $tomcatMonitorLog ]; then 41 echo "日志文件已创建">>$tomcatMonitorLog 42 else 43 echo "日志文件未创建,马上创建">>$tomcatMonitorLog 44 touch $tomcatMonitorLog 45 fi 46 47 # 初始化计数器 48 if [ -f $restartCountTxt ]; then 49 while read line 50 do 51 restartCount=$((line)) 52 done < $restartCountTxt 53 else 54 touch $restartCountTxt 55 echo "0" > $restartCountTxt 56 fi 57 58 # 判断是否已达到最大重启次数 59 if [[ "$restartCount" -eq "$maxRestartCount" ]]; then 60 tomcatServiceCodeTry=$(curl -s -m 10 -o /dev/null --connect-timeout 10 $webUrl -w %{http_code}) 61 62 # 重置重启计数器(因手动重启应用而没有重置计数器) 63 if [[ "$tomcatServiceCodeTry" -eq "$statusCode" ]]; then 64 echo '【info】tomcat运行正常,访问系统接口正常,重置计数器'>>$tomcatMonitorLog 65 true > $restartCountTxt 66 echo "0" > $restartCountTxt 67 exit 0 68 else 69 echo "已超过最大重启次数,不再自动重启">>$tomcatMonitorLog 70 echo '已超过最大重启次数,不再自动重启,请手动重启' | mail -v -s '系统告警' $email_address 71 true > $restartCountTxt 72 count=$[restartCount+1] 73 echo $count > $restartCountTxt 74 exit 0 75 fi 76 fi 77 if [[ "$restartCount" -ge "$maxRestartCount" ]]; then 78 tomcatServiceCodeTry=$(curl -s -m 10 -o /dev/null --connect-timeout 10 $webUrl -w %{http_code}) 79 # 重置重启计数器(因手动重启应用而没有重置机器) 80 if [[ "$tomcatServiceCodeTry" -eq "$statusCode" ]]; then 81 echo '【info】tomcat运行正常,访问系统接口正常,重置计数器'>>$tomcatMonitorLog 82 true > $restartCountTxt 83 echo "0" > $restartCountTxt 84 exit 0 85 else 86 echo "已超过最大重启次数,不再自动重启">>$tomcatMonitorLog 87 exit 0 88 fi 89 fi 90 91 # 获取tomcat进程id 92 tomcatId=$($isExist) 93 # 重启 94 function restart() { 95 if [ -n "$tomcatId" ]; then 96 echo "tomcat开始关闭" 97 $stopTomcat 98 fi 99 sleep 10 100 # 循环100次,直到进程已经被关闭,否则认为关闭不成功,主动关闭进程 101 for((i=1;i<100;i++)); 102 do 103 tomcatId=$($isExist) 104 if [ -n "$tomcatId" ]; then 105 sleep 10 106 echo "tomcat还没关闭,继续阻塞等待关闭完成" 107 else 108 break 109 fi 110 done 111 echo 'tomcat开始重启...' 112 $startTomcat # 启动tomcat 113 } 114 115 # 监控服务是否正常 116 function monitor() { 117 118 # 判断tomcat进程是否存在 119 if [ -n "$tomcatId" ]; then 120 tomcatServiceCodeTry=$(curl -s -m 10 -o /dev/null --connect-timeout 10 $webUrl -w %{http_code}) 121 if [[ "$tomcatServiceCodeTry" -eq "$statusCode" ]]; then 122 echo '【info】tomcat运行正常,访问系统接口正常......' 123 true > $restartCountTxt 124 echo "0" > $restartCountTxt 125 exit 0 126 else 127 sleep 10 128 for((i=0;i<$retryCount;i++)) 129 do 130 tomcatServiceCodeTry=$(curl -s -m 10 -o /dev/null --connect-timeout 10 $webUrl -w %{http_code}) 131 if [[ "$tomcatServiceCodeTry" -eq "$statusCode" ]]; then 132 echo '【info】tomcat运行正常,访问系统接口正常......' 133 true > $restartCountTxt 134 echo "0" > $restartCountTxt 135 echo "执行完成" 136 exit 0 137 else 138 echo '【error】重新访问系统接口失败' 139 sleep 30 140 fi 141 done 142 echo '【error】访问系统接口出错,请注意......开始重启tomcat' 143 echo '【error】发送告警邮件' 144 echo '【info】由于访问系统接口出错,tomcat开始自动重启' 145 true > $restartCountTxt 146 count=$[restartCount+1] 147 echo $count > $restartCountTxt 148 # 发送告警邮件 149 echo "由于访问系统接口出错,tomcat开始自动重启,地址:$webUrl" | mail -v -s "系统告警" $email_address 150 restart # 重启 151 fi 152 else 153 echo '【error】tomcat进程不存在!tomcat开始自动重启...' 154 echo '【error】$startTomcat,请稍候......' 155 echo '【error】发送告警邮件' 156 echo "由于tomcat没有启动,tomcat开始自动重启,地址:$webUrl" | mail -v -s "系统告警" $email_address 157 true > $restartCountTxt 158 count=$[restartCount+1] 159 echo $count > $restartCountTxt 160 restart # 重启 161 fi 162 } 163 monitor>>$tomcatMonitorLog
五、添加定时器
首先编写一个脚本,用来存放初始化信息,如启动tomcat的命令、日志地址、邮件地址、访问接口、重试次数、停止tomcat命令等,具体如下
1 #! /bin/bash 2 3 # tomcat启动脚本 4 startTomcat=/usr/local/apache-tomcat-7.0.92/bin/startup.sh 5 6 # 日志地址 7 tomcatMonitorLog=/usr/local/monitorApplication.log 8 9 # 邮件地址,多个逗号隔开 10 email_address=你的发送邮箱地址 11 12 # 请求接口 13 webUrl=你的应用接口 14 15 # 重试次数,每次间隔30秒 16 retryCount=5 17 18 # 最大重启次数 19 maxRestartCount=3 20 21 # 计数器文件位置 22 restartCountTxt=/usr/local/restartCountTxt.txt 23 24 # tomcat停止脚本 25 stopTomcat=/usr/local/kill.sh 26 27 # 判断容器是否存在的脚本 28 isExist=/usr/local/isExistTomcat.sh 29 30 # 执行监控脚本 31 monitorApplicationProcessId=$(ps -ef |grep monitorApplication |grep -w /usr/local |grep -v 'grep'|awk '{print $2}') 32 if [[ $monitorApplicationProcessId ]]; then 33 time=$(date "+%Y-%m-%d %H:%M:%S") 34 echo "=======================$time=======================">>$tomcatMonitorLog 35 echo "monitorApplication.sh脚本正在试行,此次定时任务不执行该脚本,直接退出,等待下一次定时任务">>$tomcatMonitorLog 36 exit 0 37 else 38 sh /usr/local/monitorApplication.sh $startTomcat $tomcatMonitorLog $email_address $webUrl $retryCount $maxRestartCount $restartCountTxt "$stopTomcat" "$isExist" 39 fi
其次,定义一个定时器,使用crontab -e命令,插入以下代码,表示一分钟执行一次check.sh脚本
*/1 * * * * /usr/local/check.sh
到此,定时监控应用的脚本就完成了。
参考博客:https://blog.csdn.net/thinkthewill/article/details/80868442
所有脚本github地址:https://github.com/1053531172/monitorApplication