最近では、古いシステムの運用中にプログラムの処理が頻繁に自動停止することが多く、システムは開発者が保守していないため、コードを修正してプログラムのバグに対応することができません。したがって、自動監視および自動障害回復用のスクリプトを作成することを検討してください。
現象
1つのプログラムが自動的にシャットダウンし、別のプログラムにバグがある可能性があります。このプログラムはデータベースをデッドロックさせます。
アイデアの処理:
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,10% %time:~0,8% Restart w3wp.exe >>c:\Restart_WEB.txt
) else exit
4.上記のスクリプトを定期的に実行するために、元の計画はブートによって自動的に実行されましたが、プログラムが手動で再起動される場合があることを考慮してください。代わりに、WINDOWSスケジュールタスクによって定期的に(5分または10分)呼び出されて実行されます。