web-dev-qa-db-ja.com

コンピュータがオンラインかどうかを確認するためにpingよりも速い方法は?

ラボコンピューターのセット用にwake on lanスクリプトを書いています。コンピューターのホスト名、IP、およびMACのリストを含むsqlite dbがあり、現在は「-c1」を使用してそれらをpingしているため、無限に実行されることはありません。 pingではなく答えますか? pingを使用すると、続行するためにpingの応答が必要になるため、スクリプトがかなり遅くなります。

提案をありがとう!

20
Jon Phenow

単一のパケットを送信して応答を待機することは、可能な限り最速の方法の1つであり、pingはそのための優れた方法です。実際、ユースケースに応じて、それは速すぎるであると主張します。これは、カーネルのネットワークサブシステムが生きているというだけで、システムが実際に何か有用なことを行っているかどうかを実際に通知しないためです。そして構成されました。

しかし、それで十分であれば、いくつかの改善を加えることができます。まず、-W1 pingタイムアウトを1秒に減らします。次に、スクリプトをさまざまなホストに非同期で(バックグラウンドスレッドで)pingし、待機するのではなく、必要に応じて結果を確認できます。

あるいは、アプローチを再考して、リモートシステムが稼働しているときに何らかの方法でチェックインし、システムがチェックインしていない場合はダウンしていると想定することもできます。

20
mattdm

これはfpingが設計された目的です。 http://fping.sourceforge.net/

戻りコードに依存する代わりに、後で出力を解析する必要がありますが、通常のpingを実行するよりもはるかに高速です。

これは1つまたは2つのコンピューターでのみ機能しますが、ステータスの確認を担当するコンピューターに直接接続する場合は、ethtoolを使用してリンクがアクティブかどうかを確認できます。

3
LawrenceC

ブロードキャストアドレスに対してpingを実行すると、すべてのコンピューターにpingが返されます。次に、このリストをSQLiteにあるものと照合して、すべてのコンピューターが稼働していることを確認します。

それ以外の場合、pingは、コンピューターがネットワーク上で起動していることを確認するためのおそらく最も速い方法です。他の回答で述べたように、これは本当に有用なデータを提供しません。スクリプトをインストールできる場合は、cronjobを追加して中央サーバーにpingを送信したり、タスクを実行したり、プロセスリストを中央サーバーにエコーして要求をログに記録したりできます。次に、単にそれをチェックすると、毎回手動でチェックする必要がない問題があるかどうかがわかります。

2
Josh K

Ganglia は、マルチキャストトラフィックを使用して、クラスター内の多くのホストを監視します。同様の方法を使用できますか?これは、ネットワークハードウェアがすべてのホストと監視システム間のマルチキャストトラフィックを許可していることを前提としています。

2
jsbillings

Cでは、

/* count = 1, wait interval = 1 second, no name lookup, */
/* 10 data bytes, 1 second timeout, 200 millisecond wait time */

sprintf(command,"ping -c1 -i1 -n -s10 -t1 -W200 %u" 
   , connection[port].IPAddress);
err = system(command);
/* err == 0 means OK */
0
Joe

私は同じ問題を抱えており、次の(迅速かつ汚い)スクリプトを考え出しました。これは基本的にすべてのpingを個別のジョブとして並行して発行し、/ 24秒のサブネット全体を3秒でスキャンします。何らかの理由で、ここではpingの結果コードを使用できないことがわかりませんでしたが、grep -vで処理できました。

#!/bin/bash
case $# in
1)
  case $1 in
  [1-9]*)
        echo
        echo Systems active in subnet: $1
        for (( K = 1 ; K < 255 ; K=$K+1 )); do
        # grep -v delivers 0 on no matches
                echo -ne "testing:" $1$K "...    \r"
                (if ping -c 1 -w 1 -n $1$K 2>&1 | grep -q '64 bytes' ; then
                echo $1$K alive "                "
                fi) &
        done
        sleep 3
        echo "                               "
        exit 0
        ;;
  esac;;
esac
0
Peer

私はfping -r0 ...が最速の応答を提供することを発見しました。

-r(再試行)オプションは、類似の-c(カウント)よりも高速に見えます。 -r0を使用すると、pingが1回だけ送信され、出力は他のオプションと比較して大幅に短縮されます。

私のシステムでは...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1

結果は...

LX00 is alive
LX02 is alive
HA01 is alive
ICMP Host Unreachable from 192.168.1.5 for ICMP Echo sent to LX01
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

ICMPメッセージを取り除くために少しマッサージすると、...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

速度に関しては、この古い1.8GHz Intelデュアルコアのfpingが4GBの場合RAMは...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1

LX00 is alive
LX02 is alive
HA01 is alive
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

real    0m0.554s
user    0m0.000s
sys     0m0.000s

そして、grepsortは、時間に0.001〜0.004秒しか追加しないようです...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

real    0m0.558s
user    0m0.000s
sys     0m0.000s

[〜#〜]メモ[〜#〜]

  • ICMPメッセージは実行のたびに発生するわけではありません。
  • 2>&1は、ICMPメッセージがに表示されないようにするために必要ですstderrではなくstdoutに送信されたときの出力
0
DocSalvager