複数のネットワークホストが正常に動作していることをすばやく確認してください。

複数のネットワークホストが正常に動作していることをすばやく確認してください。


目的:多くのホストで効率的に並列化できる方法を使用して、ホストがネットワーク上で実行されていることを確認します。

迅速なチェック処理を強調します。

速度を強調する理由:複数のテスト(数百回)をすばやく連続して実行し、結果をかなり迅速に返す必要があるためです。


現在のアプローチ

現在のスクリプトは単純なpingコマンドを使用しています。選択は必須ではありませんが、逆にどの同等またはより良い信頼性とスピードを備えた適切なツールを代替として使用することができます。

現在のスクリプト

次のように:

ping -c 1 -W 100 -q "$NETWORK_HOST" &> /dev/null

このアプローチの明らかな欠点は、1秒未満の応答時間が必要であることです。経験的に応答時間は最大1秒かかることがあります。

代替案を検討してください

順次実行速度を忘れてください。pingGNUを使用して多くのコマンドを並列に実行し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パラメータがないと、私ができるよりも速く実行され、nmapLANに接続されているすべてを見つけます。

$ time arp
real    0m0.411s

関連情報