Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 361|回复: 0

linux脚本监控应用且通过邮件报警异常

[复制链接]
  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 801 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    725708
    发表于 2021-7-3 06:38:41 | 显示全部楼层 |阅读模式

    一、背景  

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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-8 18:14 , Processed in 0.068649 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表