これにより、「インターネット接続」があることを確認できます。 「インターネット接続」がない場合(この2つの場所に正常にpingされた)、600秒待ってから続行します。
ping -W 1 -c 4 www.google.com >& /dev/null && ping -W 1 -c 4 www.yahoo.com >& /dev/null || sleep 600
しかし、インターネットに接続するまで繰り返されるように、この行をどのように書き換えることができますか?
答え1
while ! ping -W 1 -c 4 www.google.com >& /dev/null ||
! ping -W 1 -c 4 www.yahoo.com >& /dev/null; do
sleep 600
done
IPアドレスへの接続をテストしていますが、8.8.8.8はGoogleのパブリックDNSサーバーです(非常に可用性が高い)。エントリがキャッシュにある可能性があるため、DNSが機能しているかどうかをテストするのはとにかく信頼できません。
while ! ping -W 1 -c 1 8.8.8.8 >&/dev/null; do sleep 600; done
Pingが常にインターネット接続を確認する最善の方法ではありません。多くの場所、特に企業ネットワークでは、Webアクセスを除くすべてのアクセスをブロックします。高可用性サーバーからファイルをダウンロードして、ネットワークが正常に動作しているかどうかをテストできます。また、少なくともHTTPプロキシの観点からDNSをテストします(しばしば重要です)。
while ! wget -q -O /dev/null --no-cache http://www.google.com/; do sleep 6000; done
答え2
上記の方法のいくつかにはいくつかの欠陥があり、なぜ包括的な「インターネットが機能しているのですか」を1つの文で完了できない理由は次のとおりです。
pingを試みる前に、必ずリンクが有効になっていることを確認してください。イーサネットポートにケーブルが接続されていない場合、または愚かな猫がワイヤを噛んでいる場合、何も機能しません。
まず、localhostをテストする必要があります。これにより、TCP / IPスタックの整合性が検証されます。
DNSサーバーに接続できないかブロックされている場合は、ドメイン名を指定してDNS解決に依存しない可能性があります。優先DNSサーバーがダウンしても、インターネットを介して他のホストに接続できないという意味ではありません。
自分に属していないサーバーの接続を確認するために、常に同じアドレスまたはホストを使用することはお勧めできません。常に利用可能であることが知られているさまざまな/ランダムなホストのセットをテストする必要があります。
「インターネット」が正しく機能していることを実際に確認するには、さまざまなプロトコルを使用する必要があると言いたいと思います。ネットワーク上のゾンビコンピュータがDDoSの一部として多くのpingを送信し、ISPがICMPをブロックする可能性もあります。
本当に一方向のアプローチを取る必要がある場合は、私がすることは、google.comまたはあなたが選んだ他のよく知られているインターネットサイトへのパスを追跡することです。一度だけ。トラフィックがサービスプロバイダーのネットワークを離れる前に、どのくらいのホップが必要かを理解してください。その後、Tracerouteを使用して外部接続をテストできますが、ホップ数は制限されます。 Tracerouteの最終Pingが成功したら、ネットワークをシャットダウンできます。 HTTPなどのような他のプロトコルに対して「tracerouteに似た」ユーティリティを持ちたいです。
答え3
シェルでwhileループを使用できます。
while true; do
if ping -W 1 -c 4 www.google.com >& /dev/null &&
ping -W 1 -c 4 www.yahoo.com >& /dev/null; then
break
fi
sleep 600
done
/bin/true
andコマンドはtest 0
常に0(true)を返しますが、常に組み込みコマンドではない可能性がtrue
あります。
答え4
ロジックをより明確にするために、次のようにサブシェルにチェックを作成できます。
while ! ( ping -W 1 -c 4 www.google.com >& /dev/null &&
ping -W 1 -c 4 www.yahoo.com >& /dev/null ); do
sleep 600
done
または、関数にテストを書きます。
can_ping_internet() {
ping -W 1 -c 4 www.google.com && ping -W 1 -c 4 www.yahoo.com
}
while ! can_ping_internet; do
sleep 600
done