1. 程式人生 > WINDOWS開發 >WINDOWS程式監控及故障自動重啟思路及bat指令碼實現

WINDOWS程式監控及故障自動重啟思路及bat指令碼實現

最近一套老系統運營過程中經常發生程式程序自動關閉,由於系統沒有開發人員進行維護,無法通過修改程式碼實現程式bug處理。因此考慮自己寫段指令碼進行自動監控及故障自動恢復。

現象

有個程式會自動關閉,另外一個程式可能有BUG,這個程式會導致資料庫死鎖。
處理思路:

1、資料庫監控:對資料庫寫入資料進行監控,對寫入記錄少於一定量進行異常報出;
2、對於程序進行監控及重啟,查詢到沒有程序時,直接重啟程序。
3、發現監控資料庫時,有時資料庫也會因死鎖,導致查詢不到資料,對查詢資料庫進行判斷,當返回資料庫查詢異常時重啟資料庫服務。

指令碼實現

1、資料庫監控(vb指令碼)gn2.vbs:

Function Format_Time(s_Time)
    Dim y,m,d,h,mi,s
    Format_Time = ""
    If IsDate(s_Time) = False Then Exit Function
        y = cstr(year(s_Time))
        m = cstr(month(s_Time))
        If len(m) = 1 Then m = "0" & m
        d = cstr(day(s_Time))
        If len(d) = 1 Then d = "0" & d
        h = cstr(hour(s_Time))
        If len(h) = 1 Then h = "0" & h
        mi = cstr(minute(s_Time))
        If len(mi) = 1 Then mi = "0" & mi
        s = cstr(second(s_Time))
        If len(s) = 1 Then s = "0" & s
    Format_Time = y  & "-" & m & "-" & d & " "  & h & ":"  & mi & ":"  & s
End Function

‘資料庫連線字串
Dim DBConnStr
DBConnStr = "PROVIDER=SQLOLEDB;DATA SOURCE=111.111.222.222,1433;UID=sa;PWD=1122aa.0;DATABASE=database"

Dim v_DBRecordSet
Dim v_DBRecCnt
Dim v_CheckTime

‘計算查詢時間 當前時間往前5分鐘
v_CheckTime = DateAdd("n",-5,now())
v_DBRecCnt = 0

‘建立記錄集物件
On Error Resume Next
Set v_DBRecordSet=CreateObject("ADODB.Recordset")
If Err.Number Then
WScript.Echo "Message:" & Err.Description
WScript.Quit(1)
End If

‘初始化記錄集引數
v_DBRecordSet.CursorType = 0
v_DBRecordSet.CursorLocation = 2
v_DBRecordSet.LockType = 1
v_DBRecordSet.Source = "Select count(*) as CN from RunLog where SysDatetime >‘" & Format_Time(v_CheckTime) & "‘" 

On Error Resume Next
v_DBRecordSet.ActiveConnection = DBConnStr
If Err.Number Then
WScript.Echo "Message:" & Err.Description
WScript.Quit(1)
End If

On Error Resume Next
v_DBRecordSet.Open()
If Err.Number Then
WScript.Echo "Message:" & Err.Description
WScript.Quit(1)
End If

On Error Resume Next
v_DBRecCnt = v_DBRecordSet.Fields("CN")
If Err.Number Then
WScript.Echo "Message:" & Err.Description
WScript.Quit(1)
End If

‘如果等於0,則報警
if CInt(v_DBRecCnt) >100 Then
                ‘關閉記錄集
           v_DBRecordSet.Close()
                Set v_DBRecordSet = Nothing
    ‘正常退出
           WScript.Echo "前5分鐘儲存條數:" & v_DBRecCnt
    WScript.Quit(0)
else
                ‘關閉記錄集
           v_DBRecordSet.Close()
                Set v_DBRecordSet = Nothing
    ‘異常退出
           WScript.Echo "前5分鐘儲存條數:" & v_DBRecCnt
    WScript.Quit(1)
end if

2、監控資料庫及重啟服務相關指令碼(bat指令碼):

setlocal enabledelayedexpansion
cscript //nologo c:\gn2.vbs
If ERRORLEVEL 1 (net stop SQLSERVERAGENT
net stop MSSQLSERVER
PING 172.18.18.2 -n 2
net start MSSQLSERVER
net start SQLSERVERAGENT
echo %date:~0,10% %time:~0,8% Restart MSSQLSERVER Service >>c:\RESTART_GN.txt ) else goto check_gn_carrunlog
:check_gn_carrunlog
set /a carrunlog2data=0
PING 172.18.18.2 -n 50
for /f "delims=" %%! in (‘cscript //nologo c:\gn2.vbs‘) do set /a carrunlog2data =%%!
if "%carrunlog2data%" leq "0" (
call RESTART_GN.bat)

else exit

3、自動監控程序及重啟程序指令碼(bat指令碼):

setlocal enabledelayedexpansion
echo ############################時時監控,請勿關閉!######################### 
ping 172.18.18.2 -n 10 
tasklist /nh|find /i "w3wp.exe"  
If ERRORLEVEL 1 (start C:\web\web通訊伺服器\w3wp.exe 
echo %date:~0,8% Restart w3wp.exe >>c:\Restart_WEB.txt
 ) else exit

4、為定期執行以上指令碼,原計劃通過開機自動執行,但考慮偶爾會有人工重啟程式,改為通過WINDOWS 計劃任務定期(5分鐘或10分鐘)呼叫執行,目前執行效果較好。