私はカスタマイズされた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