有一个java工程没有源代码,经常出现内存溢出等问题导致服务无法正常使用。
使用下面的批处理命令实现当应用出现异常时自动重启tomcat程序。
使用方法:
1、下载curl程序,用于探测服务是否可用。下载地址:https://curl.se/windows/dl-7.75.0_3/curl-7.75.0_3-win64-mingw.zip
2、将下面的代码保存为tomcat_monitor.bat 放在tomcat/bin下
3、将<%response.getWriter().write("OK");%> 保存为healthcheck.jsp 放入webapp项目目录下
4、修改tomcat_monitor.bat中的几个参数,HealthCheckUrl 、TomcatHome、TomcatBinPath、CURL 这几个参数必须按自己的实际环境进行修改,其他参数可选修改。
5、创建计划任务,每分钟执行一次,执行程序选择 tomcat_monitor.bat
@echo off
setlocal enabledelayedexpansion
rem 把此脚本放在tomcat启动脚本所在目录tomcat/bin/下面
rem curl下载地址:https://curl.se/windows/dl-7.75.0_3/curl-7.75.0_3-win64-mingw.zip
rem healthcheck.jsp 文件内容:<%response.getWriter().write("OK");%>
rem config
set MaxTryCnt=3
set MaxCheckCnt=60
set HealthCheckUrl="http://127.0.0.1:8080/app/healthcheck.jsp"
rem TomcatHome路径要用双斜杠\\ 用于查找tomcat进程ID
set TomcatHome=G:\\apache-tomcat-7.0.53\\
set TomcatBinPath=G:\apache-tomcat-7.0.53\bin\
set TomcatStartBat=%TomcatBinPath%\startup.bat
rem 出现在''中的字符串命令需要进行转义 %->%%,\->\\,|->^^^|
rem 从任务计划启动tomcat与从用户UI操作启动tomcat,jps互相不可见,从哪个环境启动的java,从该环境jps才能看到。
set CURL=G:\apache-tomcat-7.0.53\curl-7.75.0-win64-mingw\bin\curl.exe
set HealthcheckCmd=%CURL% -s --connect-timeout 5 -m 5 %HealthCheckUrl%
set FindTomcatCmd=wmic process where "commandline like '%%%TomcatHome%%%org.apache.catalina.startup.Bootstrap%%' and name='java.exe'" get processid ^^^|findstr "[0-9]"
set logPath=%TomcatBinPath%\monitor_logs\
if not exist %logPath% mkdir %logPath%
set hourvar=%time:~0,2%
if /i %hourvar% LSS 10 (
set hourvar=0%time:~1,1%
)
set daystr=%date:~0,4%%date:~5,2%%date:~8,2%
set nowtime=%date:~0,4%-%date:~5,2%-%date:~8,2% %hourvar%:%time:~3,2%:%time:~6,2%
set nowtimestr=%date:~0,4%%date:~5,2%%date:~8,2%%hourvar%%time:~3,2%%time:~6,2%
set logFile=%logPath%\monitor.log
rem init
set /a tryCnt=0
set checkCnt=0
set checkMode=0
:HealthCheck
echo healthcheck
set result=
for /f "delims=" %%t in ('%HealthcheckCmd%') do set result=%%t
rem HealthCheck Success
if "%result%" EQU "OK" goto End
if %checkMode% EQU 1 goto CheckTomcatStartComplete
rem HealthCheck Failed
echo [%nowtime%] HealthCheck Failed,result:"%result%" >>%logFile%
set /a tryCnt=%tryCnt%+1
if !tryCnt! LSS %MaxTryCnt% goto HealthCheck
:SearchTomcatProcess
rem find and kill tomcat
set TomcatPid=
for /f "delims= " %%t in ('%FindTomcatCmd%') do set TomcatPid=%%t
rem not found tomcat process
if "%TomcatPid%" EQU "" (
echo [%nowtime%] Not Find TomcatPid! >>%logFile%
goto StartTomcat
)
:KillTomcat
echo [%nowtime%] Find Tomcat,Pid:%TomcatPid% >>%logFile%
jmap -heap %TomcatPid% >>%logPath%\heap_stack_%nowtimestr%.log
jstack -l %TomcatPid% >>%logPath%\heap_stack_%nowtimestr%.log
taskkill /PID %TomcatPid% /T /F
echo [%nowtime%] Killed Tomcat,Pid:%TomcatPid% >>%logFile%
:StartTomcat
echo [%nowtime%] Start Tomcat. >>%logFile%
%~d0
cd %TomcatBinPath%
call %TomcatStartBat%
rem 等待Tomcat启动完成
set checkMode=1
:CheckTomcatStartComplete
set /a checkCnt=%checkCnt%+1
if !checkCnt! LSS %MaxCheckCnt% (
timeout /T 5 /NOBREAK
goto HealthCheck
)
echo [%nowtime%] Start Tomcat Failed. >>%logFile%
exit 1
:End
echo [%nowtime%] Start Tomcat Success. >>%logFile%
echo End!
rem pause
exit 0