スクリプトの継続的なピンループ

スクリプトの継続的なピンループ

私はカスタマイズされたOpenwrtコンパイルをしています。私のスクリプトのいくつかは、タスクを実行する前に接続をテストするためにpingを実行します。

if [ "$(ping -c 1 -w 3 8.8.8.8)" ]; then
  do stuff;
else
 echo "no connection"
fi

そのうちのいくつかは他のスクリプトを実行するpingのに時間がかかるため、スクリプトを実行するのに必要な時間よりも時間がかかります。これは場合によっては問題になります。

いくつかのファイルに0または1を書き込む一種の連続ループを作成したいと思います。これからpingを使用した接続テストスクリプトをテストしますsomefile

このようなスクリプトを書く方法はありますか?

ベストアンサー1

簡単に言えば、

while :; do
   ping -c 1 -w 3 8.8.8.8; echo $? > /tmp/ping.status
   sleep 1
done

毎秒終了ステータスを記録しますping/tmp/ping.statusその後、他のスクリプトでは次の内容を持つことができます。

pingFailed=$(cat /tmp/ping.status)
if [ $pingFailed -ne 0 ]; then
    echo "No connection"
else
    echo "Connected!"
fi

はい、そうすることができます。しかし、これは接続を確認するのに非常に悪い方法です。明らかにここには競争条件があります。最初のループが実行されたときに接続がアクティブになっても、2番目のループがアクティブになるという意味ではありません。さらに、スクリプトの先頭からファイルを読み取っても、スクリプトの最後にもping.status接続が存在するという意味ではありません。また、ネットワークとCPUに常にスパムを送信しています。これは実際には非常にエレガントではありません。

接続が機能しているかどうかをテストするためのより迅速で簡単な方法(少なくともLinuxでは)は、ネットワークカード名を解決することです/sys/class/net/$NIC/link_mode$NICたとえば、私のシステムでは次のようになります。

## Wireless connection up
$ cat /sys/class/net/wlp3s0/link_mode 
1
## Wireless connection down
$ cat /sys/class/net/wlp3s0/link_mode 
0

これを確認する関数を書くことができます。

isLinkDown(){
    return $(cat /sys/class/net/wlp3s0/link_mode)
}

次のスクリプトで使用できます。

if isLinkDown; then 
    echo Link Down
else
    echo Link Up

おすすめ記事