忍者ブログ

pingを使ったリモート接続先の通信監視

2022年12月14日
サーバーの監視といえば、異常発生時に監視用のパソコンでアラームが鳴るのが一般的だと思う。

サーバーの移転とかがあると、監視員と監視用PCが別拠点にあって
リモートデスクトップ(RDP)で監視するパターンもある。

そこで問題になるのが、RDPだと静かに接続が切れて監視できていないことに気付かないこと。


今回は、リモートデスクトップ先のPCとの疎通確認をして、異常時にブザーを鳴らすバッチファイルについて。

先に白状すると、9割がネットからパクったソース。
ping監視に関する動作は、そのまま移植させてもらった。
世の中には同じことを考えることが多いこと。



■例によってまずは検索

ブザーを鳴らす方法は知ってたので、Pingを打ってその応答から文字を抜き出してどう判定するか。

細かいキーワードで検索したものの、Pingの応答結果のなにをもって○×か判断できず。


同じことやりたい人いるやろと思って、Ping監視で検索した以下のサイトがヒット。

pingを使ってFF14のサーバーの応答時間監視バッチファイル
http://yaonobibouroku.blogspot.com/p/pingff14bpsms-ping1-5-1-ping-ping-ping.html


クリーンヒット!!!

監視についてはIPアドレス変えるだけじゃん!



■ブザー鳴動の制御について

ブザーについては、以下のステップでできる。
1 コマンドプロンプトでCtrl+Gをタイプ後、「 > bel.txt」でテキストファイルに保存。
2 出力されたテキストファイルをコピー
3 バッチファイルのechoの後にコピーしたテキスト(制御文字)を貼り付け。

鳴動するブザー音は、エラー発生時に出るポップアップの音。
単発終わるからといって、複数BEL文字を書いても鳴るのは1回だけ。

音を変えるには、ブザー鳴動後にtimeout 0(0秒待つ処理)を入れて再度ブザー鳴動させるしかない。
間に入れるtimeout 0の数を1~3個で調整するくらいしかできなかった。



■Pingを打つ条件について

一瞬でも通信が切れたらリモートデスクトップが切れてしまうので、
Pingを打つ条件を変更。

回数は1回で、応答待ち時間は300ms、次のPingを打つWaitは1秒。
※ 動作確認するときは、Waitを3秒くらい持たせないと、バッチファイルが暴走したときになかなか終了できなくなる。

回数はできるだけ多い方がいいんだけど、PCへの負担を考えるとこのくらいがやっとかなぁ。



■画面表示について

長時間動かしっぱなしにするので、テキストが溢れるのが怖い。
レスポンスが正常に返ってきているときは、何もメッセージを表示せず、
異常発生時には、日時を付けて表示するようにした。
(本当は、異常から正常に変わった時にも状況を表示したかったけどやり方がわからず断念)



■停止方法について

ブザーが鳴ったら、コマンドプロンプトに対してCtrl+Cで中断できる。

今回のブザー鳴動はメインのバッチファイルで表示しているので、
終了確認の画面が出たタイミングで音が止まる。

当初はブザー鳴動を別バッチから呼び出していたので、音が止まらず焦った。。。



久しぶりにバッチファイルをいじった。
長いバッチのソースをいじるのは初めてだったけど、元になったソースが優秀で簡単に編集できた。


てな感じで、以下ソース。ソーステキストはこちら
※ 制御文字はWEBからのコピペはできないので注意。


pingRDP.bat

::http://yaonobibouroku.blogspot.com/p/pingff14bpsms-ping1-5-1-ping-ping-ping.html

@echo off
title RDP先のping監視

::回線速度bpsではなく、応答時間で判断する。
::pingを確認するだけなのでFF14などのゲーム以外でも使用可能
:: 95行目付近の正常メッセージ「快適です」はrem で非表示にしている
::***********************設定**************************

::ワールドがあるサーバのIPアドレス(デフォルト:FF14のGaiaサーバ)
set WORLD=124.150.157.157

::1周期あたりの時間はループ待ち時間とping回数の合計
::ループの待ち時間(デフォルト:55秒)
set WAITTIME=1

::1ループで実行するpingの回数(デフォルト:5回)
set PINGTIMES=1

::pingの応答待ち時間(デフォルト:300ms)一條追加
set PINGWAIT=300

::しきい値設定(ms)
set EXCELLENT=10
set GOOD=20
set NORMAL=50
set BAD=100

::ログ作成の有無(0は作成しない。1は作成する)ログの保存場所はこのファイルと同じ場所
set LOGGING=0

::FINE値より悪化で警告音を鳴らす。(0は鳴らさない。1は鳴らす。)
set BEEP=0
::回線が死んでいる場合は設定によらず警告音がなります。

::一時ファイルの保存場所
set TEMPDIR=c:\temp

::*****************************************************

mkdir %TEMPDIR% > NUL 2>&1
set /A SKIP=%PINGTIMES%+6
set AVERAGEPING=0
if not %LOGGING%==0 (
if not %LOGGING%==1 (
echo ログ作成の設定が不正です。
pause
exit /B
)
)
if not %BEEP%==0 (
if not %BEEP%==1 (
echo ビープ音の設定が不正です。
pause
exit /B
)
)

::ログファイルと画面の初期化
if %LOGGING%==1 (
if not exist ping_daily.txt (echo 日付,時間,最小,最大,平均 > ping_daily.txt)
)
echo ************RDP接続先の監視************
echo 日付 時間 平均 状態
echo ------------------------------------

::以下無勉ループ
:loop
ping -n %PINGTIMES% -w %PINGWAIT% %WORLD% > %TEMPDIR%\\pinglog.txt
@if errorlevel 1 GOTO NG
@if errorlevel 0 GOTO OK

:NG
echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% 回線が死にました。。。Beep音「 」
rem rundll32 user32.dll,MessageBeep
timeout %WAITTIME% > NUL
goto loop

:OK
if %LOGGING%==1 (
for /F "eol=; skip=%SKIP% tokens=3,6,9 delims=m " %%i in (%TEMPDIR%\\pinglog.txt) do (
@echo %DATE%,%time:~0,2%:%time:~3,2%:%time:~6,2%,%%i,%%j,%%k >> ping_daily.txt
set /a AVERAGEPING=%%k
)
)

if %LOGGING%==0 (
for /F "eol=; skip=%SKIP% tokens=3,6,9 delims=m " %%i in (%TEMPDIR%\\pinglog.txt) do (
set /a AVERAGEPING=%%k
)
)

rem if %AVERAGEPING% lss %EXCELLENT% echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %AVERAGEPING%ms とても快適です。
rem if %AVERAGEPING% geq %EXCELLENT% if %AVERAGEPING% lss %GOOD% echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %AVERAGEPING%ms 快適です。
rem if %AVERAGEPING% geq %GOOD% if %AVERAGEPING% lss %NORMAL% echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %AVERAGEPING%ms 普通です。

if %BEEP%==0 (
if %AVERAGEPING% geq %NORMAL% if %AVERAGEPING% lss %BAD% echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %AVERAGEPING%ms 厳しいです。
if %AVERAGEPING% geq %BAD% echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %AVERAGEPING%ms もうむりぽ。
)

if %BEEP%==1 (
if %AVERAGEPING% geq %NORMAL% if %AVERAGEPING% lss %BAD% (
echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %AVERAGEPING%ms 厳しいです。
rem rundll32 user32.dll,MessageBeep
)
if %AVERAGEPING% geq %BAD% (
echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %AVERAGEPING%ms もうむりぽ。
rem rundll32 user32.dll,MessageBeep
)
)

timeout %WAITTIME% > NUL
goto loop


PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字