目的:多くのホストで効率的に並列化できる方法を使用して、ホストがネットワーク上で実行されていることを確認します。
迅速なチェック処理を強調します。
速度を強調する理由:複数のテスト(数百回)をすばやく連続して実行し、結果をかなり迅速に返す必要があるためです。
現在のアプローチ
現在のスクリプトは単純なping
コマンドを使用しています。選択は必須ではありませんが、逆にどの同等またはより良い信頼性とスピードを備えた適切なツールを代替として使用することができます。
現在のスクリプト
次のように:
ping -c 1 -W 100 -q "$NETWORK_HOST" &> /dev/null
このアプローチの明らかな欠点は、1秒未満の応答時間が必要であることです。経験的に応答時間は最大1秒かかることがあります。
代替案を検討してください
順次実行速度を忘れてください。ping
GNUを使用して多くのコマンドを並列に実行しparallel
、最後に結果を照合します。これは試しましたが、実際には悪いようです。
より良いソリューションへの直感
このようだping
可能「ポーリング状態の確認」でうまく動作します。応答がない場合に備えて、非常に短い時間とタイムアウトを待つだけです。
前提:ネットワークは信頼性が高く高速であると見なされますが、ホストが必ずしもこれらの特性を持つ必要はありません。
質問
この問題をどのように解決しますか?どのツールを使用しますか?これは正しいアプローチですか?コードスニペットを提供できますか?
- 環境:OS X + Ubuntuホスト
- スクリプトシェル: Bash
- 必要に応じて追加のソフトウェアをインストールできます。
- リポジトリにないアプリケーションに対して新しいコードをコンパイル/インストールして使用できます。
答え1
pingが十分に良ければ、平らなすぐに並列に作業できる代替手段です。
これは私が使用するものの単純化されたバージョンです。パイプで接続されたホストのリスト(1行に1つ)と連携します。
probe_hosts() {
local report
fping 2>/dev/null | while read report;
do
local host=${report/ is *}
local state=${report/* is }
if [ "$state" == "alive" ];
then
echo $host
else
echo unreachable: $host >&2
fi
done
}
# this is how you use it:
cat list_of_hosts \
| probe_hosts \
| do_something_with_live_hosts
答え2
nmap
範囲を指定できます。
$ nmap -sn 138.0.0.0/24
$ nmap -sn 138.0.0.0-255
この-sn
フラグは、ホストに対してpingのみを実行して返すことを意味します(つまり、通常どおりnmap
ポートスキャンを実行しません)。
編集する:コメントを読んだ後、Bahamatが言及したものを見ましたarp
。実際にarp
パラメータがないと、私ができるよりも速く実行され、nmap
LANに接続されているすべてを見つけます。
$ time arp
real 0m0.411s