ラボコンピューターのセット用にwake on lanスクリプトを書いています。コンピューターのホスト名、IP、およびMACのリストを含むsqlite dbがあり、現在は「-c1」を使用してそれらをpingしているため、無限に実行されることはありません。 pingではなく答えますか? pingを使用すると、続行するためにpingの応答が必要になるため、スクリプトがかなり遅くなります。
提案をありがとう!
単一のパケットを送信して応答を待機することは、可能な限り最速の方法の1つであり、pingはそのための優れた方法です。実際、ユースケースに応じて、それは速すぎるであると主張します。これは、カーネルのネットワークサブシステムが生きているというだけで、システムが実際に何か有用なことを行っているかどうかを実際に通知しないためです。そして構成されました。
しかし、それで十分であれば、いくつかの改善を加えることができます。まず、-W1
pingタイムアウトを1秒に減らします。次に、スクリプトをさまざまなホストに非同期で(バックグラウンドスレッドで)pingし、待機するのではなく、必要に応じて結果を確認できます。
あるいは、アプローチを再考して、リモートシステムが稼働しているときに何らかの方法でチェックインし、システムがチェックインしていない場合はダウンしていると想定することもできます。
これはfpingが設計された目的です。 http://fping.sourceforge.net/
戻りコードに依存する代わりに、後で出力を解析する必要がありますが、通常のpingを実行するよりもはるかに高速です。
これは1つまたは2つのコンピューターでのみ機能しますが、ステータスの確認を担当するコンピューターに直接接続する場合は、ethtool
を使用してリンクがアクティブかどうかを確認できます。
ブロードキャストアドレスに対してpingを実行すると、すべてのコンピューターにpingが返されます。次に、このリストをSQLiteにあるものと照合して、すべてのコンピューターが稼働していることを確認します。
それ以外の場合、pingは、コンピューターがネットワーク上で起動していることを確認するためのおそらく最も速い方法です。他の回答で述べたように、これは本当に有用なデータを提供しません。スクリプトをインストールできる場合は、cronjobを追加して中央サーバーにpingを送信したり、タスクを実行したり、プロセスリストを中央サーバーにエコーして要求をログに記録したりできます。次に、単にそれをチェックすると、毎回手動でチェックする必要がない問題があるかどうかがわかります。
Ganglia は、マルチキャストトラフィックを使用して、クラスター内の多くのホストを監視します。同様の方法を使用できますか?これは、ネットワークハードウェアがすべてのホストと監視システム間のマルチキャストトラフィックを許可していることを前提としています。
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 */
私は同じ問題を抱えており、次の(迅速かつ汚い)スクリプトを考え出しました。これは基本的にすべての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
私は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
そして、grep
とsort
は、時間に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
に送信されたときの出力