Windows下Tomcat宕機后自動重啟Tomcat服務
如何在Windows服務器上創建一個bat腳本,通過curl工具監測Tomcat服務的狀態。當Tomcat無故宕機時,腳本會自動重啟服務。首先,需要安裝curl環境,然后設置腳本,包括定義URL、Tomcat路徑、啟動和關閉命令等,通過循環檢測HTT P狀態碼來判斷服務是否正常,異常時執行重啟操作。
一、問題描述及解決原理
把項目發布到windows服務器中,如tomcat工程不穩定,會有無故宕機的問題。如果通過程序無法解決,并且重啟tomcat服務能夠生效的話,可以做一個自動檢測并重啟的腳本。
腳本通過檢測tomcat對應的工程鏈接(http或者https)是否已經正常啟動,如果未正常啟動,則重啟tomcat服務。
二、安裝curl環境
1、curl介紹
curl(全稱Client URL):用于在命令行下運行的網絡工具,用于與服務器進行通信。它支持多種協議,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet and TFTP。 curl 支持SSL證書, HTTP POST, HTTP PUT, FTP上傳, 基于HTTP表單的上傳, 代理, HTTP/2, cookies, 用戶+密碼認證 (Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos), 文件傳輸修復, 隧道代理等等。
2、官網網站:https://curl.se/download.html
3、配置步驟
(1)下翻找到windwos版本,點擊最新對應版本下載,我下載的是64位的

(2)點擊進入后,下載對應架構的包。(比如我的是x86,就下載第一個)

(3)解壓下載的壓縮包,并將解壓后的放在某個目錄下

(5)打開命令行窗口驗證,如下即成功。(命令行要打開一個新的)

三、bat腳本
@echo off
setlocal enabledelayedexpansion
rem 鏈接
set URL="http://localhost:8080"
rem tomcat目錄
set TOMCAT_HOME="E:\HMMJabTY\Tomcat8"
rem 關閉tomcat命令的路徑
set CLOSE_CMD=%TOMCAT_HOME%\bin\shutdown.bat
rem 啟動tomcat命令的路徑
set START_CMD=%TOMCAT_HOME%\bin\start.bat
rem tomcat緩存目錄
set TOMCAT_CACHE=%TOMCAT_HOME%\work
rem 日志文件的路徑
set LOG_PATH=%TOMCAT_HOME%\check.log
rem 每次檢測完后等待時間,再進行下一次檢測,秒,若將程序部署到系統計劃任務,可忽略
set TIME_WAIT=5
:loop
set httpcode=0
cd /d %TOMCAT_HOME%
echo %date% %time%
echo 'begin checking tomcat'
echo %date% %time% >>%LOG_PATH%
for /l %%i in (1,1,3) do (
echo %%i
for /f "delims=" %%r in ('curl -sL -w "%%{http_code}" %URL% -o /dev/null') do (
set httpcode=%%r
if !httpcode!==200 (
GOTO :OUTFOR
)
)
)
:OUTFOR
echo %httpcode% >>%LOG_PATH%
if not %httpcode%==200 (
echo close tomcat >>%LOG_PATH%
call %CLOSE_CMD%
timeout -t 5 >nul
echo success to close tomcat >>%LOG_PATH%
rd /S /Q %TOMCAT_CACHE%
echo start tomcat >>%LOG_PATH%
call %START_CMD%
echo success to start tomcat
echo success to start tomcat >>%LOG_PATH%
) else (
echo the tomcat run is ok
echo the tomcat run is ok >>%LOG_PATH%
)
timeout -t 3 >nul
rem 若將腳本程序部署到系統計劃程序中,將以下代碼可注釋
timeout -t %TIME_WAIT% >nul
goto loop四、擴展:腳本解析
腳本邏輯:該腳本會自動檢測tomcat啟動成功后的一個地址,(就是你tomcat啟動成功后能訪問的一個地址,你可以寫一個測試地址,比如我這里是http://localhost:8080/),如果訪問不到就會自動啟動tomcat的start.bat文件
@echo off
# 在此語句后所有運行的命令都不顯示命令行本身,但是本身的指令是會顯示出來的
setlocal enabledelayedexpansion
# 先了解一下批處理運行命令的機制:批處理讀取命令時是按行讀取的(另外例如for命令等,其后用一對圓括號閉合的所有語句也當作一行),在處理之前要完成必要的預處理工作,這其中就包括對該行命令中的變量賦值。
# 此語句含義:本地延遲擴展。延遲變量,全程延遲環境變量擴展。即不是先給該行變量賦值,而是在運行過程中給變量賦值。
rem 鏈接
# rem在bat腳本中為注釋,執行腳本時會忽略此語句
set URL="https://localhost:8080"
# set指令用來設置變量
rem tomcat目錄
set TOMCAT_HOME="E:\HMMJabTY\Tomcat8"
rem 關閉tomcat命令的路徑
set CLOSE_CMD=%TOMCAT_HOME%\bin\shutdown.bat
rem 啟動tomcat命令的路徑
set START_CMD=%TOMCAT_HOME%\bin\start.bat
rem tomcat緩存目錄
set TOMCAT_CACHE=%TOMCAT_HOME%\work
rem 日志文件的路徑
set LOG_PATH=%TOMCAT_HOME%\check.log
rem 每次檢測完后等待時間,再進行下一次檢測,秒,若將程序部署到系統計劃任務,可忽略
set TIME_WAIT=5
:loop
# 在Bat中有標簽一詞,跟C語言的函數類似。并且標簽必須單獨一行,并且以冒號開頭。
set httpcode=0
cd /d %TOMCAT_HOME%
echo %date% %time%
echo 'begin checking tomcat'
echo %date% %time% >>%LOG_PATH%
# >>追加內容到文件末尾,而不會清除原有的內容主要將本來顯示在屏幕上的內容輸出到指定文件中指定文件如果不存在,則自動生成該文件
# 循環指令。這里需要了解兩個關鍵字%i、%%i。%i這個關鍵字不能在bat中使用。只能再CMD命令下的for中使用,%%i是在bat的for中使用的指令。
# 規則:for、in和do是for語句的關鍵字,它們三個缺一不可。
# /l:表示以增量形式從開始到結束的一個數字序列
# (1,1,3):跟參數/l配合使用時,表示從1開始,以1遞增,直到3。這就是循環3次。
# /f:主要用來處理文件和一些命令的輸出結果。它可以提取文本文件的內容,進行逐行分析和處理
# delims=符號列表:切分字符串。沒有指定符號則for /f語句以空格鍵或跳格鍵作為分隔符;如果制定了如“delims=,.”,則以逗號和句號作為被處理的字符串的分隔符號。
# curl:
# -s: 靜默模式,在命令行中不會輸出無關中間過程信息
# -L:自動重定向,有的網址是自動跳轉的。使用-L參數,curl就會跳轉到新的網址。
# -k:在發送https請求時,加上-k參數,否則會有如下證書的報錯。如果是http請求,可以不加。
# -o:將返回內容輸出到文件中。其中nul相當于linux中的/dev/null。功能就是一種特殊的虛擬設備,用于寫入而不是讀取。寫入/dev/null的任何內容都會從操作系統中消失。
# -w:操作完成后在返回信息尾部追加指定的內容。完成請求傳輸后,使 curl 在 stdout 上顯示自定義信息。%%{http_code}為返回的狀態碼。(狀態碼文檔末尾有各種碼值的解釋)
for /l %%i in (1,1,3) do (
echo %%i
for /f "delims=" %%r in ('curl -sL -k %URL% -o nul -w "%%{http_code}"' ) do (
set httpcode=%%r
if !httpcode!==200 (
GOTO :OUTFOR
)
)
)
:OUTFOR
echo %httpcode% >>%LOG_PATH%
# call:使用call命令,可以調用其它程序(包括批處理文件、其它執行命令)或標簽。
# timeout -t 5:延時5s操作。>nul作用為屏幕不提示
if not %httpcode%==200 (
echo close tomcat >>%LOG_PATH%
call %CLOSE_CMD%
timeout -t 5 >nul
echo success to close tomcat >>%LOG_PATH%
# /S:表示除目錄本身外,還將刪除指定目錄下的所有子目錄和文件。用于刪除目錄樹。
# /Q:安靜模式,帶/S 刪除目錄樹時不要求確認。
rd /S /Q %TOMCAT_CACHE%
echo start tomcat >>%LOG_PATH%
call %START_CMD%
echo success to start tomcat
echo success to start tomcat >>%LOG_PATH%
) else (
echo the tomcat run is ok
echo the tomcat run is ok >>%LOG_PATH%
)
timeout -t 3 >nul
rem 若將腳本程序部署到系統計劃程序中,將以下代碼可注釋
timeout -t %TIME_WAIT% >nul
goto loop使用tomcat8w啟動
上述腳本是讓tomcat使用cmd窗口啟動,如果想用tomcat8w啟動,如下圖,則將腳本做微調可實現。

(1)編寫restart.bat腳本
新建一個文件restart.bat,將以下腳本放在里邊,并放到tomcat/bin目錄下。
@echo off net start tomcat8w
(2)修改START_CMD參數
將上述的啟動tomcat命令的路徑,start_cmd改為restart.bat
上一篇:網站安全:IIS基于并發請求數阻止 IP 地址
下一篇:Linux快速安裝Niginx的shell腳本
