最近一套老系統運營過程當中常常發生程序進程自動關閉,因爲系統沒有開發人員進行維護,沒法經過修改代碼實現程序bug處理。所以考慮本身寫段腳本進行自動監控及故障自動恢復。web
有個程序會自動關閉,另一個程序可能有BUG,這個程序會致使數據庫死鎖。
處理思路:數據庫
一、數據庫監控:對數據庫寫入數據進行監控,對寫入記錄少於必定量進行異常報出;
二、對於進程進行監控及重啓,查詢到沒有進程時,直接重啓進程。
三、發現監控數據庫時,有時數據庫也會因死鎖,致使查詢不到數據,對查詢數據庫進行判斷,當返回數據庫查詢異常時重啓數據庫服務。服務器
一、數據庫監控(vb腳本)gn2.vbs:ide
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
二、監控數據庫及重啓服務相關腳本(bat腳本):ui
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
三、自動監控進程及重啓進程腳本(bat腳本):code
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,10% %time:~0,8% Restart w3wp.exe >>c:\Restart_WEB.txt ) else exit
四、經過判斷進程是否自動關閉,若是程序bug自動關閉了進程則自動重啓進程。orm
tasklist|find /i "Center.exe" if %errorlevel%==1 (start C:\Center\web\Center.exe) else exit
五、爲按期執行以上腳本,原計劃經過開機自動執行,但考慮偶爾會有人工重啓程序,改成經過WINDOWS 計劃任務按期(5分鐘或10分鐘)調用執行,目前執行效果較好。對象