ネットワーク内のデバイスのうち、1日中オンラインになっているはずのデバイスが実際にオンラインであるかどうかをチェックし続けるスクリプトを作成します。私はpingを使用しようとしましたが、
if [ "`ping -c 1 some_ip_here`" ]
then
echo 1
else
echo 0
fi
有効なIPアドレスまたは無効なIPアドレスを入力しても、1
が表示されます。特定のアドレス(またはIPアドレスのリストにある任意のデバイス)がオフラインになったかどうかを確認するにはどうすればよいですか?
Pingは、エラーのタイプに応じて異なる終了コードを返します。
ping 256.256.256.256 ; echo $?
# 68
ping -c 1 127.0.0.1 ; echo $?
# 0
ping -c 1 192.168.1.5 ; echo $?
# 2
0はホストが到達可能であることを意味します
2は到達不能を意味します
Ifステートメントにバックティックは必要ありません。このチェックを使用できます
if ping -c 1 some_ip_here &> /dev/null
then
echo 1
else
echo 0
fi
Ifコマンドは、次のコマンドの終了コード(ping)をチェックします。終了コードがゼロの場合(コマンドが正常に終了したことを意味します)、thenブロックが実行されます。ゼロ以外の終了コードを返す場合、elseブロックが実行されます。
Pingの高度なバージョン-"fping"があり、ミリ秒単位でタイムアウトを定義できます。
#!/bin/bash
IP='192.168.1.1'
fping -c1 -t300 $IP 2>/dev/null 1>/dev/null
if [ "$?" = 0 ]
then
echo "Host found"
else
echo "Host not found"
fi
私はこのような1つのライナーを実行すると考えることができます
ping -c 1 127.0.0.1 &> /dev/null && echo success || echo fail
127.0.0.1をIPまたはホスト名に置き換え、echoコマンドをどちらの場合でも実行する必要があるものに置き換えます。
上記のコードは成功します。アクセスできないIPまたはホスト名を試してみてください。
このような:
ping -c 1 google.com &> /dev/null && echo success || echo fail
この
ping -c 1 lolcatz.ninja &> /dev/null && echo success || echo fail
参考までに、上記の方法を使用してテストを行いました。マルチpingを使用する場合(10リクエスト)
ping -c10 8.8.8.8&>/dev/null;エコー$?
マルチpingコマンドの結果は、pingの結果の少なくとも1つが到達可能な場合は「0」になり、すべてのping要求に到達できない場合は「1」になります。
up=`fping -r 1 $1 `
if [ -z "${up}" ]; then
printf "Host $1 not responding to ping \n"
else
printf "Host $1 responding to ping \n"
fi