
ifステートメントでpingコマンドを使用しようとしています。 get go から始まり、特定の数のリクエストが送信されます。たとえば、ping -c 6 hostname
これらのパケットのアサーションは成功したと見なされますif [ $result -gt 4]
。中損失のあるリンク例えば、戻ってきてください。
ある程度調べましたが、各コマンド(ping -c 1 hostname
)に対して別々のパケットを送信するだけです。これは時間がかかり、接続状態をうまく反映しません。私が本当に興味深かったことの1つは、パイプを使用して単語を整数としてgrep
計算するwc
ことができましたが、それまでは進まなかったが、残念ながら単一のパケットテストにのみ焦点を当てたことです。
ファイルに書き込むことは別の方法ですが、次のループ(すべてのループに含まれています)で上書きされ、実際に大きくなっていなくても書きたくありません。
私が望むのは、ファイルサーバーが利用可能かどうかをテストすることです。その場合はインストールし、それ以外の場合はインストールしないでください。そしてシステムがハングしたりトンネルが開かないように、できるだけ早く失われた共有をアンマウントしてください。 AppleScriptを使用してautomountd
これを行いましたが、autofs
唯一のスクリプト言語であるBashスクリプトbc [1.]を使用します。少しネットワークに戻すときにすばやく接続する余裕がある場合や、ネットワークから切り替えたときにシステムがハングするのを防ぐために、小さなパケット展開で迅速かつ継続的にテストする方法を理解し、[2.]
より良い方法がありますが、grep
単一のコマンドでped行を変換して量子化し、if文で使用する方法を学びたいです。
ありがとうございます!
答え1
6つのパケットのうち少なくとも4つのパケットが受信されたかどうかをテストしようとしています。つまり、パケット損失は厳密に50%未満です(受信した6つのパケットのうち3つは50%の損失を意味します)。
if ping -c 6 "$server" | awk -F, '/packet loss/ { exit !((0+$3) < 50) }'
then
printf 'Server "%s" is alive and returning more than 50%% of packets\n' "$server"
else
printf 'Server "%s" is in bad shape\n' "$server"
fi
awk
このコマンドは、出力にテキストを含む行を調べます。行の3番目のカンマ区切りフィールドには、パケット損失率という数字があります。この数は、算術的文脈でフィールドを解釈して(0を追加することによって)得られます。コードを終了すると、ステータスはパケット損失が50%未満であるかどうかを反映します(0 =はい、0ではない=いいえ)。packet loss
ping
awk
答え2
これを使用して、awk
成功した応答数を計算します。
if ping -c6 "$server" | awk '/bytes from/ { k++ } END { exit !(k>=4) }'
then
echo OK
else
echo Dubious
fi
一致する各行はbytes from
カウンタをインクリメントしますk
。終了ステータスが成功(0)の場合のみk >= 4