Domino AdministratorでのMail監視 -11-
<話題の履歴>
Domino AdministratorでのMail監視 -1-
Domino AdministratorでのMail監視 -2-
Domino AdministratorでのMail監視 -3-
Domino AdministratorでのMail監視 -4-
Domino AdministratorでのMail監視 -5-
Domino AdministratorでのMail監視 -6-
Domino AdministratorでのMail監視 -7-
Domino AdministratorでのMail監視 -8-
Domino AdministratorでのMail監視 -9-
Domino AdministratorでのMail監視 -10-
前回は、単純なSample ProgramでRemote Console CommandのResponseが正常に判断出来ることを確認しました。
今回は、この結果から、以前作成したAgentを修正してOSに頼らないRecovery処理を実現してみます。
前回の実験でSendConsoleCommandによる値が正常に取れていることは確認できています。
最初からちゃんと実験してWindows Batchなど使わないで実装する方法を試せという言葉が聞こえて来そうですが、色々な方法を試すのも良い事ですのでお許しください。
では、早速SendConsoleCommandを使った方法を実装して行きますが、修正部分はCode全体からすると最後の部分のみとなります。
前回記述した以下の部分を修正して行きます。
'Print error message and reload router when over the threshold.
If wait_cnt_all => Max_Wait Then
Print "Wait over : " & CStr(wait_cnt_all) & " ( Threshold : " & CStr(Max_Wait) & " )"
Print "Maybe router has some problem, router is restarted in a few minuttes."
os_ret = Shell("reloadrouter.bat")
End If
今回のLogicは以下のようになります。
[Wait MailがThresholdを超えた場合]
Router Taskの存在を確認("show tasks only"の結果でRouterの有無を確認)
>> 存在する場合
Router Taskの応答を確認("tell router status"の結果でRouterのCommand受入を確認)
>> 応答する場合
Router Taskの問題ではないと判断し、Message表示
>> 応答しない場合
Router Taskの問題と判断し、"restart task router"でRouter再起動
>> 存在しない場合
"load router"でRouter起動
前回も書きましたが、このLogicはRouter Taskが存在しない場合は問題ないと思いますが、Router Taskが存在し何らかの原因でRouterに異常がある場合は"tell router status"が応答しないことを前提としています。
Routerの起動時にMail.boxのConsistency CheckでRouter起動の待ち時間がTimeoutしてしまいRouterが自動終了してしまった場合は、SMTP Taskや他のServerが書き込んだMailがMail.boxに滞留し始め、Thresholdを超えた段階でRouterがLoadされることになります。
この場合、Thresholdの設定は、ServerのMail流量を把握して適切な値を設定することが重要になります。
Router Taskが動作している場合であれば、RouterのLoadは行われませんので、低い値に設定するのも手だと思います。
Routerの起動時にConsistency Checkが原因でMail.boxのFile TableにAccessできない場合は、Router Taskは稼働している状態のままMail.boxが参照できない状態に陥ると考えられますが、この場合には、"tell router status"がどのような状態を返すかによります。
もし、Tell CommandをAcceptしてしまうようであれば、上記のLogicは通用しないということに注意してください。
ただ、このような状態でもMessageだけは表示しますので、自動修復は行えませんが、Operatorが監視しているような環境であれば対処することは可能でしょう。
こういう注意点があるということを前提にCodeを書くと以下のようになります。
'Print error message and reload router when over the threshold.
If wait_cnt_all => Max_Wait Then
Print "Wait over : " & CStr(wait_cnt_all) & " ( Threshold : " & CStr(Max_Wait) & " )"
'Check router task status.
cons_ret = ss.Sendconsolecommand("", "show tasks only")
If InStr(cons_ret, "Router") > 0 Then 'Router task exist
'Check router task response.
cons_ret = ss.Sendconsolecommand("", "tell router status")
If InStr(cons_ret, "The ROUTER task either does not exist") > 0 Then 'Router not responding
cons_ret = ss.Sendconsolecommand("", "restart task router")
Print "Restarting router task is executed by agent."
Else
Print "Maybe router/network/other server(s) have some problem, please check server status."
End If
Else 'Router task does not exist
cons_ret = ss.Sendconsolecommand("", "load router")
Print "Loading router task is executed by agent."
End If
End If
Routerが正常稼働している場合に影響が無いかを確認す意味も含め、Mail Waitの閾値を0に設定して実行すると以下のようになります。
> tell amgr run "Test\MBCheck.nsf" 'ChkMailboxDoc'
[0EA4:0027-078C] 2015/05/09 22:04:42 AMgr: Start executing agent 'ChkMailboxDoc' in 'Test\MBCheck.nsf'
[0EA4:0027-078C] 2015/05/09 22:04:42 Agent Manager: Agent printing: Mail box ( 1 ) All : 2
[0EA4:0027-078C] 2015/05/09 22:04:42 Agent Manager: Agent printing: Wait: 0
[0EA4:0027-078C] 2015/05/09 22:04:42 Agent Manager: Agent printing: Hold: 2
[0EA4:0027-078C] 2015/05/09 22:04:42 Agent Manager: Agent printing: Dead: 0
[0EA4:0027-078C] 2015/05/09 22:04:42 Agent Manager: Agent printing: Mail box ( 2 ) All : 2
[0EA4:0027-078C] 2015/05/09 22:04:42 Agent Manager: Agent printing: Wait: 0
[0EA4:0027-078C] 2015/05/09 22:04:42 Agent Manager: Agent printing: Hold: 2
[0EA4:0027-078C] 2015/05/09 22:04:42 Agent Manager: Agent printing: Dead: 0
[0EA4:0027-078C] 2015/05/09 22:04:42 Agent Manager: Agent printing: All mail boxes ( Mail boxes : 2 ) :4
[0EA4:0027-078C] 2015/05/09 22:04:42 Agent Manager: Agent printing: Wait: 0
[0EA4:0027-078C] 2015/05/09 22:04:42 Agent Manager: Agent printing: Hold: 4
[0EA4:0027-078C] 2015/05/09 22:04:42 Agent Manager: Agent printing: Dead: 0
[0EA4:0027-078C] 2015/05/09 22:04:42 Agent Manager: Agent printing: Wait over: 0 ( Threshold : 0 )
> show tasks only >C:\Users\ADMINI~1\AppData\Local\Temp\notes048967\rem83932.con
> tell router status >C:\Users\ADMINI~1\AppData\Local\Temp\notes048967\rem98186.con
>
[057C:0002-0090] Msgs State Via Destination
[057C:0002-0090] Transfer Threads: Max = 25; Total = 0; Inactive = 0; Max Concurrent = 12
[057C:0002-0090] Delivery Threads: Max = 25; Total = 1; Inactive = 0
[057C:0002-0090] Dispatch Threads: Max = 4; Total = 2; Inactive = 2
[057C:0002-0090] Sweep Threads: Max = 4; Total = 2; Inactive = 2
[0EA4:0027-078C] 2015/05/09 22:04:43 Agent Manager: Agent printing: Maybe router/network/other server(s) have some problem, please check server status.
[0EA4:0027-078C] 2015/05/09 22:04:43 Agent Manager: Agent printing: Hold over: 4 ( Threshold : 0 )
[0EA4:0027-078C] 2015/05/09 22:04:43 Agent Manager: Agent printing: Dead over: 0 ( Threshold : 0 )
[0EA4:0027-078C] 2015/05/09 22:04:43 AMgr: Agent 'ChkMailboxDoc' in 'Test\MBCheck.nsf' completed execution
Messageが表示されますが、Router TaskのLoadやRestartは行われていません。
次にRouter Taskを停止した状態で実行すると以下のようになります。
> tell amgr run "Test\MBCheck.nsf" 'ChkMailboxDoc'
[0EA4:0028-0F5C] 2015/05/09 22:14:16 AMgr: Start executing agent 'ChkMailboxDoc' in 'Test\MBCheck.nsf'
[0EA4:0028-0F5C] 2015/05/09 22:14:16 Agent Manager: Agent printing: Mail box ( 1 ) All : 2
[0EA4:0028-0F5C] 2015/05/09 22:14:16 Agent Manager: Agent printing: Wait: 0
[0EA4:0028-0F5C] 2015/05/09 22:14:16 Agent Manager: Agent printing: Hold: 2
[0EA4:0028-0F5C] 2015/05/09 22:14:16 Agent Manager: Agent printing: Dead: 0
[0EA4:0028-0F5C] 2015/05/09 22:14:16 Agent Manager: Agent printing: Mail box ( 2 ) All : 2
[0EA4:0028-0F5C] 2015/05/09 22:14:16 Agent Manager: Agent printing: Wait: 0
[0EA4:0028-0F5C] 2015/05/09 22:14:16 Agent Manager: Agent printing: Hold: 2
[0EA4:0028-0F5C] 2015/05/09 22:14:16 Agent Manager: Agent printing: Dead: 0
[0EA4:0028-0F5C] 2015/05/09 22:14:16 Agent Manager: Agent printing: All mail boxes ( Mail boxes : 2 ) :4
[0EA4:0028-0F5C] 2015/05/09 22:14:16 Agent Manager: Agent printing: Wait: 0
[0EA4:0028-0F5C] 2015/05/09 22:14:16 Agent Manager: Agent printing: Hold: 4
[0EA4:0028-0F5C] 2015/05/09 22:14:16 Agent Manager: Agent printing: Dead: 0
[0EA4:0028-0F5C] 2015/05/09 22:14:16 Agent Manager: Agent printing: Wait over: 0 ( Threshold : 0 )
> show tasks only >C:\Users\ADMINI~1\AppData\Local\Temp\notes048967\rem75867.con
> load router >C:\Users\ADMINI~1\AppData\Local\Temp\notes048967\rem03092.con
[0470:0002-0C24] 2015/05/09 22:14:17 Router: Mail Router started for domain LOTUS
[0470:0002-0C24] 2015/05/09 22:14:17 Router: Internet SMTP host domsvr in domain lotus.com
[0EA4:0028-0F5C] 2015/05/09 22:14:17 Agent Manager: Agent printing: Loading router task is executed by agent.
[0EA4:0028-0F5C] 2015/05/09 22:14:17 Agent Manager: Agent printing: Hold over: 4 ( Threshold : 0 )
[0EA4:0028-0F5C] 2015/05/09 22:14:17 Agent Manager: Agent printing: Dead over: 0 ( Threshold : 0 )
[0EA4:0028-0F5C] 2015/05/09 22:14:17 AMgr: Agent 'ChkMailboxDoc' in 'Test\MBCheck.nsf' completed execution
Router Taskの停止が検知され、RouterがLoadされたことが分かります。
ここまでは期待通りの動きになっています。
本当にCheckしなかればならないのは、Router Taskが存在し、かつ、返答が無い場合なのですが、簡単にはそのような状況は作れませんので、実際にそのような状態になった場合に動作を確認するしかなさそうです。
もし、そのような状態になった場合は、AgentがPrintしているMessageをEvent HandlerでSyslogやEvent MonitorにMessageを記録するようにしておけば、他の方法を使って通知することが出来るでしょう。
また、Routerが正常である場合にMail滞留が起こっていることが検知された場合は、AgentがPrintしているMessageをEvent HandlerでSyslogやEvent MonitorにMessageを記録すると同時にEvent HandlerでNotes Mailとe-Mailを送付し注意を促すことが考えられます。
以前作成したOS側での検知に比べるとRemote Console Commandで作成されたFileの削除は不要ですし、MaintenanceもNotesの知識だけで行えるため、こちらの方がNotes/Domino Userの皆さんにとっては親しみやすいかも知れません。
以前作成したOS側での検知に関しても、"tell router status"の戻り値を判断するようにすれば、同様の監視が行えます。
今回は、Notes/DominoのAgentだけでMail滞留監視を実現してみました。
次回は、設計を触ることなく、通常の運用Operatorが容易に閾値の設定変更を出来るように改造してみます。