一、背景
最近接到监控应用并通过邮件报警的任务,由于需求比较简单,故没有使用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 |