一、前言
通过三种方式分别可以重启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