サーバーに継続的にpingを送信し、サーバーが現在ダウンしているなど、サーバーが応答するたびにメッセージボックスを表示したいと考えています。バッチファイルでやりたいです。
ここで述べたようにメッセージボックスを表示できますWindowsバッチファイルからポップアップ/メッセージボックスを表示します
継続的にpingを実行できます
ping <servername> -t
しかし、それが応答したかどうかを確認するにはどうすればよいですか?
サーバーに継続的にpingを送信し、サーバーが現在ダウンしているなど、サーバーが応答するたびにメッセージボックスを表示したいと考えています。バッチファイルでやりたいです。
ここで述べたようにメッセージボックスを表示できますWindowsバッチファイルからポップアップ/メッセージボックスを表示します
継続的にpingを実行できます
ping <servername> -t
しかし、それが応答したかどうかを確認するにはどうすればよいですか?
問題は、このスクリプトが行う ping の応答を確認することでした。
ただし、これは ERRORLEVEL 0 を返し、このスクリプトで使用される Received = 1 のチェックに合格し、スクリプトから Link is UP を返すため、Host Unreachable メッセージを受け取った場合は機能しません。Host Unreachable は、ping が動作しないターゲットに配信されたが、リモート ホストが見つからない場合に発生します。
ping が成功したかどうかを確認する正しい方法を思い出すと、Find を使用して文字列 'TTL' を探すことです。
@echo off
cls
set ip=%1
ping -n 1 %ip% | find "TTL"
if not errorlevel 1 set error=win
if errorlevel 1 set error=fail
cls
echo Result: %error%
これは、IPv6 アドレスから応答を受信したときに ping が TTL をリストしないため、IPv6 ネットワークでは機能しません。
次のchecklink.cmd
プログラムは、開始するのに適した場所です。これは、シングル ショットの ping を実行できるという事実と、成功した場合の出力に次の行が含まれるという事実に依存しています。
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
トークン 5 と 7 を抽出し、それぞれ"Received"
と"1,"
であることを確認することで、成功を検出できます。
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
:loop
set state=down
for /f "tokens=5,6,7" %%a in ('ping -n 1 !ipaddr!') do (
if "x%%b"=="xunreachable." goto :endloop
if "x%%a"=="xReceived" if "x%%c"=="x1," set state=up
)
:endloop
echo.Link is !state!
ping -n 6 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
テストする名前 (または IP アドレス) で呼び出します。
checklink 127.0.0.1
checklink localhost
checklink nosuchaddress
ロケールが英語でない場合は、スペイン語Received
など、ロケールの対応するキーワードに置き換える必要があることに注意してください。recibidos
テスト ping を実行して、ロケールで使用されているキーワードを確認します。
状態が変化したときにのみ通知するには、次を使用できます。
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
set oldstate=neither
:loop
set state=down
for /f "tokens=5,7" %%a in ('ping -n 1 !ipaddr!') do (
if "x%%a"=="xReceived" if "x%%b"=="x1," set state=up
)
if not !state!==!oldstate! (
echo.Link is !state!
set oldstate=!state!
)
ping -n 2 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
ただし、Gabe がコメントで指摘しているERRORLEVEL
ように、上記の 2 番目のスクリプトに相当するものは次のようになります。
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
set oldstate=neither
:loop
set state=up
ping -n 1 !ipaddr! >nul: 2>nul:
if not !errorlevel!==0 set state=down
if not !state!==!oldstate! (
echo.Link is !state!
set oldstate=!state!
)
ping -n 2 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
これが古いスレッドであることは知っていますが、システムでマシンが稼働しているかどうかをテストしたかったので、誤解していない限り、ルーターがアドレスに到達できないと報告した場合、上記のいずれも機能しません。ほとんどすべてのWINマシンで「KISS」したかったので、スクリプトではなくバッチファイルを使用しています。したがって、私が使用したアプローチは、次のように複数のpingを実行して「Lost = 0」をテストすることでした
ping -n 2 %pingAddr% | find /I "Lost = 0"
if %errorlevel% == 0 goto OK
私はこれを厳密にテストしていませんが、これまでのところそれは私のために仕事をします
「-t」なしで ping を実行し、ping の終了コードを確認できます。応答がない場合は失敗を報告します。
ping に対して 3 つの結果が表示されました。IP が「ホストに到達できません」と「タイムアウト」(正確な言い回しはわかりません) と応答する「必要な」ものです。
最初の 2 つは 0 の ERRORLEVEL を返します。
タイムアウトは 1 の ERRORLEVEL を返します。
返される可能性があるその他の結果とエラー レベルはありますか? (許容可能なスイッチとエラーレベル 1 を返す無効なスイッチを使用する以外に。)
どうやら Host Unreachable は以前に投稿されたメソッドの 1 つを使用できます (コードを書いている場合に誰かがいつ返信するかを理解するのは難しいですが) が、タイムアウトは解析できるのと同様の方法で返されますか?
一般に、ping の結果のどの部分を解析できるかを知るにはどうすればよいでしょうか? (つまり、Sent および/または Received および/または TTL は解析可能であるのに、ホスト到達不能ではないのはなぜですか?
ああ、iSid さん、これを読んでいる人は十分なポイントを持っていないので、賛成票があまりないのかもしれません。そのため、彼らは質問に答えて (または答えずに) 去っていきます。
上記を回答として投稿していませんでした。それはコメントであるべきだったが、私はその選択を見ませんでした。
#!/bin/bash
logPath="pinglog.txt"
while(true)
do
# refresh the timestamp before each ping attempt
theTime=$(date -Iseconds)
# refresh the ping variable
ping google.com -n 1
if [ $? -eq 0 ]
then
echo $theTime + '| connection is up' >> $logPath
else
echo $theTime + '| connection is down' >> $logPath
fi
Sleep 1
echo ' '
done