hakeの日記

Windows環境でプログラミングの勉強をしています。

ネット接続失敗時の自動リトライ

4月19日の日記でスペカ導入したらネット接続に失敗する割合が減ったと書きましたが、最近また調子が悪くなってきました。確率としては一発で接続成功する方が少ないくらいです。有線LANやダイアルアップ接続ではこんなことないので、やっぱ無線LANカードに問題があるんだろうか?


マニュアルで接続する場合は接続操作をやりなおせば良いわけなのであまり気にしませんが、昨日の日記の例のように寝ている間に自動で実行させたい場合に差し障りがあるので、対応を考えました。
通常ではスクリプト内のネット接続の記述は

echo QPE/Network 'connectRequest()' > /var/spool/inputhelper/qcop
sleep 1
/home/QtPalmtop/bin/qcop QPE/InputHelper 'key(QString)' "click Escape"

としています、ちなみにInputHelperで[Cancel](Escape)を押しているのは画面右下に表示される接続ダイアログ表示を消すためです。これをネット接続が確立するまで繰り返すようにさせたいと思います。
ネット接続が成功しているかいないかを知る情報が何かないかと調べたところ、ifconfigの出力が使えそうです。ネット接続していない場合はifconfigの出力は、lo (loopback)のみになりますが、例えば無線LANでネット接続している場合はwlan0が追加されます。これを利用して

while [ -z `/sbin/ifconfig | grep -e "^[^lo].*Link"`]
do
  echo QPE/Network 'connectRequest()' > /var/spool/inputhelper/qcop
  sleep 1
  /home/QtPalmtop/bin/qcop QPE/InputHelper 'key(QString)' "click Escape"
  sleep 20
done

としました。while文のループ条件は、ifconfigの出力中に「行頭が“lo”でなく、かつ、“Link”を含む行」が存在しない場合という意味です。grepで使用している正規表現が正しいかはイマイチ自信がありませんが、うまく動いているっぽいので良しとしましょう。
sleep 20は毎回のネット接続失敗が確定するまでの待ち時間20秒です。