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

posted @ 2018-12-11 15:48  无聊的小剑  阅读(1845)  评论(0编辑  收藏  举报