Bashでエコー応答をif文カウンタ要求に変換するには?

Bashでエコー応答をif文カウンタ要求に変換するには?

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 losspingawk

おすすめ記事