OS標準ツールだけでなんとかLayer7監視をする

「Windows7に標準搭載されるツールだけでLinuxホストの生存監視をする」

今回こんなお題がありました。
グーグル先生に相談したものの、ぴったりの先人のネタが無かったので自分用に書き記します。

細かな要件は

  1. 追加のアプリケーションを使わずに実現すること
  2. Ping(L3)レベルではなく、telnet(L4~7)レベルでホストの正常性を確認できること
  3. 一定間隔で繰り返し自動実行され、異常発生時はアクションを起こして知らせること

専用の高級アプリを使えない場合に使えるかもしれません。なお、Windows7は標準でtelnet.exeを含みませんが、OSの追加パッケージとして媒体を使わずにインストールする事が可能です。

Telnet : よく寄せられる質問 – Microsoft

バッチファイル

バッチファイルでTelnet接続を呼び出し→アクセス時ログから生存確認チェック→アクションを行います。

@ECHO OFF

SET SERVERNAME=チェックしたいサーバ名
SET FILEPATH=C:\chktool\

::telnet.exeかTeraTermマクロのいずれかにてtelnet接続

REM Telnet.exeで接続する場合
cscript %FILEPATH%chktelnet.vbs

REM TeraTermで接続する場合
"c:\Program Files\teraterm\ttermpro.exe" /V /M="%FILEPATH%telnetmacro.ttl"

::telnet接続結果ファイルの内容確認
FIND /N "%SERVERNAME%" "%FILEPATH%chktelnet.log"
IF ERRORLEVEL 1 GOTO DEAD
GOTO ALIVE

::telnet結果が異常時
:DEAD
REM エラーを音で知らせる
"C:\Windows\Media\Windows Critical Stop.wav"
REM Administratorにメッセージをポップアップ
msg Administrator /TIME:0 "%date% %time% !!!%SERVERNAME% is not response!!"
REM タイムスタンプ付きロギング(ファイルに追記)
ECHO %date% %time% !!!%SERVERNAME% is not response!!! >> "%LOGFILEPATH%result.log"

GOTO END

::telnet結果が正常時
:ALIVE
REM タイムスタンプ付きロギング(ファイルは上書き)
ECHO %date% %time% %SERVERNAME% is alive. > "%LOGFILEPATH%%CHKLOGFILE%"

:END

このバッチファイルをOS標準のタスクスケジューラに登録し、一定間隔で毎日実行するよう設定すればOK

Telnet.exeで接続する場合

ファイル名:chktelnet.vbsとしてバッチファイルと同じフォルダに作成します。

set WshShell = WScript.CreateObject("Wscript.Shell")
WshShell.AppActivate "mngchk"
Wscript.Sleep 1000
WshShell.SendKeys "telnet~"
Wscript.Sleep 1000
'Telnetlogをchktelnet.logとして記録
WshShell.SendKeys "set logfile chktelnet.log~"
Wscript.Sleep 1000
'以下接続先のIPアドレスに変更してください
WshShell.SendKeys "open xxx.xxx.xxx.xxx~"
Wscript.Sleep 1000
'サーバのアカウントに変更して下さい
WshShell.SendKeys "username~"
Wscript.Sleep 1000
'アカウントのパスワードに変更して下さい
WshShell.SendKeys "password~"
Wscript.Sleep 2000
'ログを取るコマンド(この場合はhostnameを採取してTelnetの正常としています)
WshShell.SendKeys "hostname~"
Wscript.Sleep 2000
WshShell.SendKeys "exit~"
Wscript.Sleep 4000
WshShell.SendKeys "~"
Wscript.Sleep 1000
WshShell.SendKeys "quit~"
Wscript.Sleep 1000
WshShell.SendKeys "exit~"
Wscript.Quit

標準のtelnet.exeのみで実行する場合、入力を丸々エミュレートしたWSHのSendKeysメソッドで強引に入力しています。あまり推奨できないやり方のようですが、VBAで書くとかなり長くなる模様。この方法の他の短所として入力のウィンドウ(MS-DOSプロンプト)がアクティブである必要があり、バックグラウンドでの実行には対応できません。また、実行時に他の操作を行うとタイミングがシビアな為、アクセス失敗→障害誤発報となる可能性が高いです。
基本的には触らない、専用の監視端末を用意出来る場合のみ有効な方法といえます。

もし、広く使われているフリーのターミナルソフト、Tera Termが使えるならマクロでもっとスマートに実現できます。

TeraTermで接続する場合

ファイル名:telnetmacro.ttl

logfile='C:\chktool\chktelnet.log'
str1='xxx.xxx.xxx.xxx:23 /nossh /T=1 /timeout=10'

logopen logfile 0 0
connect str1

if result<>2 then
end
endif

wait 'login:'
sendln 'username'
wait 'Password:'
sendln 'password'
wait '>'
sendln 'hostname'
wait '>'
sendln 'exit'
timeout=5

logclose
end

TeraTermマクロで接続するメリットとして、完全バックグラウンド動作ができるのと入力の確実性が向上します。タスクスケジューラに登録する際、”ユーザーがログオンしているかどうかにかかわらず実行する”を選ぶことでログインの有無に関わらず、又オペレータにDOSプロンプトを表示する事無く実行されます。
Telnetで接続する先を23番ポートではなく、25番(SMTP)や80番(HTTP)にし、hostnameコマンドを各プロセスへのHELLOコマンドみたいなモノに入れ替えれば、他のL7プロセスの生存監視がもきるでしょう。

コメントを残す