朋友公司的 tomcat運行在windows平台下,其提到tomcat不是很穩定,老是掛,有沒有什麼好的辦法。其中給他的建議裡有一條,讓其開一個tomcat的守護進程。由於windows下不像linux(Linux平台下各種命令、各種文法、各種順手),win平台下bat感覺既弱又難理解。不過這裡還是找了下之前寫過的tomcat進程守護指令碼,改了下寫了一個。
同一個思種, 擷取某個URL的狀態代碼,對比HTTP狀態代碼是否為200,如果不是200,將該主機的某個特定tomcat進行重啟(針對單台主機上有多個tomcat的情況)。擷取狀態代碼,能過純win平台實現的方法有兩種:其一是增加curl.exe ,另一種方法是通過VBS實現 。
一、curl.exe實現
bat代碼如下:
@echo off
:loop
set "httpcode="
cd /d c:\curl
for /f "delims=" %%r in ('curl.exe -sL -w "%%{http_code}" "http://127.0.0.1:8080/" -o nul') do (
set httpcode=%%r
)
echo %httpcode%
if not "%httpcode%"=="200 " (
taskkill /F /FI "WINDOWTITLE eq tomcat_8080"
ping -n 3 127.0.0.1>nul
set CATALINA_HOME=C:\tomcat
set EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat
rem call "%EXECUTABLE%" start && exit
call "%EXECUTABLE%" start
) else (
echo "the tomcat run is ok!'
)
ping -n 30 127.0.0.1>nul
goto loop
這裡的等待是通過ping等待實現的,現使用sleep,也需要調用VBS指令碼實現,具體可以查看windows下的計時等待 。擷取到的httpcode變數這裡需要注意,比如擷取的值是200,其後面是有空格的,所以條件寫的時候後面的200也要有空格 ,當然也可以curl |findstr 的方式判讀是否存在200去做。
taskkill 這裡殺進程時,會匹配視窗標題,這是在一台主機啟動多個tomcat 的情況下,可以區分對待。對不同的tomat指定不同標題的方法可以參看 修改Tomcat視窗標題 。
二、VBS實現
這裡並沒有給出一個完整的功能實現的代碼,因為vbs和bat寫起來太蛋疼了,這裡只給一個範例程式碼:
'Get HttpCode
set oHttp=CreateObject("MSXML2.XMLHTTP")
oHttp.Open "GET","https://www.111cn.net/",False
oHttp.Send
If oHttp.Status = 200 Then
MsgBox("Http Status Code is 200 OK.")
Else
MsgBox("正常。")
End If
'WScript.Echo oHttp.Status
set oHTTP=Nothing
BAT裡如果調用vbs指令碼,也可以通過cscript 命令進行調用。
三、其他
針對多個URL,通過BAT取狀態和連線時間的,還有一段代碼非常不錯,內容如下:
@echo off
setlocal enableextensions disabledelayedexpansion
rem Just to test - Generate a file with URLs
> ".\urls.txt" (
echo http://superuser.com
echo http://www.111cn.net
echo http://www.baidu.com
)
> ".\testResults.txt" (
for /f "useback delims=" %%u in (".\urls.txt") do (
set "statusCode="
echo([%%u]
cd /d c:\curl\
for /f "tokens=1,2 delims=#" %%a in ('
curl -w "##%%{time_connect}##." -I -s --url "%%~u"
^| findstr /l /b /c:"HTTP/" /c:"##"
') do if "%%b"=="." (
setlocal enabledelayedexpansion
echo( !statusCode! - %%a
endlocal
) else (
set "statusCode=%%a"
)
)
)
雖然看起來比較精妙,但是還是比較難理解,這個是根據國外某站上的一段代碼改的。
沒有營養的內容先到這裡吧,本篇只是為了做一個對比,後續準備寫一個python實現的windows守護進程 。再通過pyexe產生exe檔案,感覺比bat好不少。