首页

因jvm虚拟机内存溢出OnOutOfMemoryError或其他未知错误OnError需在linux自动重启tomcat服务方法

标签:OnOutOfMemoryError,OnError,tomcat自动重启     发布时间:2019-11-01   

一、前言

通过三种方式分别可以重启tomcat服务: jvm args参数OnError或OnOutOfMemoryError设置执行重启tomcat脚本、linux定时crontab -e脚本设置监控超时情况重启tomcat、java代码监控重启tomcat。

二、方法说明

方法一:通过在jvm args参数配置OnOutOfMemoryError内存溢出和OnError错误触发重启tomcat,完整JAVA_OPTS配置参考如下

 JAVA_OPTS="$JAVA_OPTS -server -Xms300M -Xmx790M   -XX:OnOutOfMemoryError=/root/tomcat.sh   -XX:+HeapDumpOnOutOfMemoryError   -XX:HeapDumpPath=/home/app/tomcat7/logs/dump    -XX:ErrorFile=/home/app/tomcat7/logs/error/hs_err_pid.log   -XX:OnError=/root/tomcat.sh   -XX:ParallelGCThreads=4  -XX:PermSize=50M  -XX:MaxPermSize=128M   -XX:-DisableExplicitGC -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled    -Dsolr.solr.home=/home/app/tomcat7/bin/solr-md "

方法二:linux下配置tomcat监控超时脚本,并加入定时计划定期检测执行(如设置2分钟执行一次)

1)设置tomcat超时脚本,参考脚本如下>>

[root@iZuf6gyurl0fqb87hirq23Z ~]# cd  /root/@b@[root@iZuf6gyurl0fqb87hirq23Z ~]# vi  tomcatmon.sh @b@ @b@#!/bin/sh@b@# function:自动监控tomcat进程,宕机就执行重启@b@# author:www.xwood.net@b@# DEFINE@b@@b@tomcat_home=/home/app/tomcat7@b@# 获取tomcat PPID@b@TomcatID=$(ps -ef |grep tomcat |grep -w $tomcat_home |grep -v 'grep'|awk '{print $2}')@b@@b@# tomcat_startup@b@StartTomcat=/home/app/tomcat7/bin/startup.sh@b@ShutdownTomcat=/home/app/tomcat7/bin/shutdown.sh@b@TomcatLog=/home/app/tomcat7/logs@b@TomcatWork=/home/app/tomcat7/work@b@#TomcatCache=/home/app/tomcat7/work@b@@b@# 定义要监控的页面地址@b@WebUrl=http://www.xwood.net/xwood-gw/ivy-libs/index.html@b@@b@# 日志输出@b@GetPageInfo=/dev/null@b@TomcatMonitorLogPath=/root/logs/tomcatmon.log@b@@b@@b@@b@Monitor()@b@{@b@    echo "[info]开始监控tomcat...[$(date +'%F %H:%M:%S')]"@b@    if [ "$TomcatID" != "" ];then@b@    echo "[info]tomcat进程ID为:$TomcatID.]"@b@    # 获取返回状态码@b@    TomcatServiceCode=$(curl -s -o $GetPageInfo -m 10 --connect-timeout 10 $WebUrl -w %{http_code})@b@    if [ $TomcatServiceCode -eq 200 ];then@b@        echo "[info]返回码为$TomcatServiceCode,tomcat启动成功,页面正常."@b@    else@b@        echo "[error]访问出错,状态码为$TomcatServiceCode,错误日志已输出到$GetPageInfo"@b@        echo "[error]开始重启tomcat"@b@@b@        kill -9  $TomcatID@b@@b@        $ShutdownTomcat@b@@b@        rm $TomcatLog/* -rf@b@        rm $TomcatWork/* -rf@b@        sleep 10@b@@b@        #rm -rf $TomcatCache # 清理tomcat缓存@b@        $StartTomcat@b@    fi@b@    else@b@    echo "[error]进程不存在!tomcat自动重启..."@b@    echo "[info]$StartTomcat,请稍候......"@b@    #rm -rf $TomcatCache@b@    $StartTomcat@b@    fi@b@    echo "------------------------------"@b@}@b@Monitor>>$TomcatMonitorLogPath

2) 系统定时器配置,加入执行计划(2分钟执行一次)

[root@iZuf6gyurl0fqb87hirq23Z ~]# crontab -e@b@@b@@b@*/2 * * * * sh /root/tomcatmon.sh@b@ @b@~

3)监控之下日志情况

[root@iZuf6gyurl0fqb87hirq23Z ~]# tail -f /var/log/cron @b@...@b@Nov 10 23:32:01 localhost CROND[31461]: (root) CMD (sh /root/tomcatmon.sh)@b@Nov 10 23:34:01 localhost CROND[31473]: (root) CMD (sh /root/tomcatmon.sh)@b@Nov 10 23:36:01 localhost CROND[31503]: (root) CMD (sh /root/tomcatmon.sh)@b@Nov 10 23:38:01 localhost CROND[31515]: (root) CMD (sh /root/tomcatmon.sh)@b@Nov 10 23:40:01 localhost CROND[31528]: (root) CMD (sh /root/tomcatmon.sh)@b@Nov 10 23:40:01 localhost CROND[31529]: (root) CMD (/usr/lib64/sa/sa1 1 1)@b@Nov 10 23:42:01 localhost CROND[31543]: (root) CMD (sh /root/tomcatmon.sh)@b@Nov 10 23:44:01 localhost CROND[31555]: (root) CMD (sh /root/tomcatmon.sh)@b@Nov 10 23:46:01 localhost CROND[31586]: (root) CMD (sh /root/tomcatmon.sh)@b@Nov 10 23:48:01 localhost CROND[31637]: (root) CMD (sh /root/tomcatmon.sh)
[root@iZuf6gyurl0fqb87hirq23Z ~]# tail  -f  ~/logs/tomcatmon.log @b@[info]开始监控tomcat...[2019-11-10 23:28:01]@b@[info]tomcat进程ID为:30549.]@b@[info]返回码为200,tomcat启动成功,页面正常.@b@------------------------------@b@@b@@b@[info]开始监控tomcat...[2019-11-10 23:32:01]@b@[info]tomcat进程ID为:30549.]@b@[info]返回码为200,tomcat启动成功,页面正常.@b@------------------------------@b@[info]开始监控tomcat...[2019-11-10 23:34:01]@b@[info]tomcat进程ID为:30549.]@b@[info]返回码为200,tomcat启动成功,页面正常.@b@------------------------------@b@[info]开始监控tomcat...[2019-11-10 23:36:01]@b@[info]tomcat进程ID为:30549.]@b@[info]返回码为200,tomcat启动成功,页面正常.@b@------------------------------@b@[info]开始监控tomcat...[2019-11-10 23:38:01]@b@[info]tomcat进程ID为:30549.]@b@[info]返回码为200,tomcat启动成功,页面正常.@b@------------------------------@b@[info]开始监控tomcat...[2019-11-10 23:40:01]@b@[info]tomcat进程ID为:30549.]@b@[info]返回码为200,tomcat启动成功,页面正常.@b@------------------------------@b@[info]开始监控tomcat...[2019-11-10 23:42:01]@b@[info]tomcat进程ID为:30549.]@b@[info]返回码为200,tomcat启动成功,页面正常.@b@------------------------------@b@[info]开始监控tomcat...[2019-11-10 23:44:01]@b@[info]tomcat进程ID为:30549.]@b@[info]返回码为200,tomcat启动成功,页面正常.@b@------------------------------@b@[info]开始监控tomcat...[2019-11-10 23:46:01]@b@[info]tomcat进程ID为:30549.]@b@[info]返回码为200,tomcat启动成功,页面正常.@b@------------------------------

方法三:通过java代码实现tomcat监控的代码示例

TomcatMonitor.java监控源码

import java.io.BufferedReader;@b@import java.io.IOException;@b@import java.io.InputStream;@b@import java.io.InputStreamReader;@b@import java.net.MalformedURLException;@b@import java.net.URL;@b@import java.net.URLConnection;@b@import java.util.Properties;@b@ @b@public class TomcatMonitor implements Runnable{@b@    @b@    String start=""; //系统命令 启动@b@    String stop=""; //系统命令 关闭@b@    String testHttp="";  //测试连接地址@b@    int testIntervalTime=1;//测试连接间隔时间,单位为秒@b@    int waitIntervalTime=2; //等待测试间隔时间,单位为秒@b@    int testTotalCount=5; //测试连接总次数@b@    @b@    Thread thread=null;@b@    @b@    public TomcatMonitor(){@b@        InputStream in = TomcatMonitor.class.getResourceAsStream("config.properties");@b@        Properties p = new Properties();@b@         try {@b@            p.load(in);@b@            stop=p.getProperty("stop");@b@            start=p.getProperty("start");@b@            testHttp=p.getProperty("testHttp");@b@            testIntervalTime=Integer.parseInt(p.getProperty("testIntervalTime"));@b@            waitIntervalTime=Integer.parseInt(p.getProperty("waitIntervalTime"));@b@            testTotalCount=Integer.parseInt(p.getProperty("testTotalCount"));           @b@        } catch (Exception e) {@b@                    e.printStackTrace();@b@        }@b@            @b@        System.out.println("*******************初始化成功!*******************");@b@         @b@        @b@        thread=new Thread(this);@b@        thread.start();     @b@    }@b@    @b@    public void run() {@b@        System.out.println("正在监控中...");   @b@        int testCount=0;@b@        while(true){@b@            testCount=0;@b@            testCount++;            @b@            boolean isrun=test();@b@            System.out.println("正在启动测试连接,尝试连接次数为:"+testCount+",结果为:"+(isrun==false?"失败.":"成功!"));               @b@            while(!isrun){@b@                if(testCount>=testTotalCount)break;@b@                try {@b@                    Thread.sleep(testIntervalTime*1000);@b@                } catch (InterruptedException e) {@b@                    e.printStackTrace();@b@                }@b@                testCount++;@b@                System.out.println("正在启动测试连接,尝试连接次数为:"+testCount+",结果为:"+(isrun==false?"失败.":"成功!"));               @b@                isrun=test();@b@            }@b@            @b@            if(!isrun){             @b@                try{      @b@                    //关闭tomcat服务    @b@                    Process proc = Runtime.getRuntime().exec(stop);@b@                    Thread.sleep(5000);@b@                    //启动tomcat服务@b@                    System.out.println("测试连接失败,正在重启tomcat");@b@                    Process p=Runtime.getRuntime().exec(start); @b@                    System.out.println("重启tomcat成功");@b@                }catch(Exception e){@b@                    e.printStackTrace();@b@                    System.out.println("重启tomcat异常,请查看先关错误信息。。。。。");@b@                    @b@                }               @b@            }@b@            @b@            try {@b@                Thread.sleep(waitIntervalTime*1000);@b@            } catch (InterruptedException e) {@b@                e.printStackTrace();@b@            }@b@            @b@            isrun=test();@b@        }       @b@    }@b@    @b@    public boolean test(){@b@        @b@        URL url=null;       @b@        try {@b@            url = new URL(testHttp);@b@        } catch (MalformedURLException e) {@b@            e.printStackTrace();@b@        }@b@        try {@b@            URLConnection urlConn=url.openConnection();@b@            urlConn.setReadTimeout(15000);@b@            BufferedReader reader = new BufferedReader(new InputStreamReader( urlConn.getInputStream()));            //实例化输入流,并获取网页代码@b@                   String s;                                       @b@                   while ((s = reader.readLine()) != null) {@b@                      return true;   @b@                   }                        @b@        } catch (Exception e) {@b@          return false;@b@        }@b@        return false;@b@    }@b@    @b@    @b@    public static void main(String[] args) throws Exception{@b@        TomcatMonitor tm=new TomcatMonitor();@b@    }@b@ @b@}

config.properties配置文件

#系统命令 启动@b@start=net start Tomcat7@b@@b@#关闭@b@stop = net stop Tomcat7@b@@b@#测试连接总次数@b@testTotalCount=3@b@@b@#连接失败时,再次检测时间间隔,单位为秒@b@testIntervalTime=3@b@@b@#连接超时时间,即多少秒tomcat没响应视为宕机,单位为秒@b@connectionTimeout=15@b@@b@#tomcat启动时间,防止在tomcat尚未启动完成的时候,程序又去检验tomcat状态,造成尚未启动完成又重新启动,单位为秒@b@tomcatStartTime=600@b@@b@#测试连接地址@b@testHttp=http://127.0.0.1:8080@b@@b@#正常情况下,每次检测间隔时间,单位为秒@b@waitIntervalTime=30@b@————————————————@b@版权声明:本文为CSDN博主「冰 河」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。@b@原文链接:https://blog.csdn.net/l1028386804/article/details/60587663
  • ◆ 相关内容