スポンサーサイト

 --------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
カテゴリ :スポンサー広告 トラックバック(-) コメント(-)

RaspberryPi wlanのコネクションが途絶えたら再接続するスクリプト

 2016-10-01
WiFi内蔵のRaspberryPi3Bだとそういうこともないっぽいんだけども、RasPi?無印やRasPi2あたりにUSBでWiFiインターフェースを追加していると、極希にコネクション落としちゃって、その後復帰しない事がある。
無線APを再起動後に再接続してこない事がたびたびあって、困ってるんだけども、よく分からないので、とりあえずスクリプトでお世話させている。
本当は、ちゃんとしたネットワークの設定があるのかも? わからん!
 

やってること/やりたいこと

  • 指定されたIPアドレス(ルータ等)にpingを投げてみる
  • pingの返答があれば何もしないで終了する
  • pingの返答がなければwlanのifdown/ifupを行う
  • しばらく待ってからまたpingを投げるところからやってみる
  • 上記を指定回数繰り返す
  • やっぱりpingの返答が無かった場合、全てをあきらめてrebootする


script

スクリプトのコードはこんな感じ↓
#!/bin/zsh -f

### settings
RETRY_COUNT=5
RETRY_WAIT=15
SYSLOG_PREFIX="CHK_WLAN"

PING_TARGET="192.168.64.1"
PING_TIMEOUT=5
PING_COUNT=11
PING_LOSS_LIMIT=50 # percentage

WLAN_IF="wlan0"
IF_UP_DOWN_WAIT=30
### end settings



### subroutines #######################################################

function FUNC_CHK_MAIN(){
COUNT=${1}
if [ ${COUNT} -gt ${RETRY_COUNT} ]; then
logger -t "${SYSLOG_PREFIX}" "retry count expired, try system reboot."
sync ; sync ; sync
reboot
exit 1
fi

local PING_LOSS=`FUNC_PING_CHK`
if [ ${PING_LOSS} -gt ${PING_LOSS_LIMIT} ]; then
logger -t "${SYSLOG_PREFIX}" "check${COUNT} : failed. (${PING_LOSS}% ping loss)"
FUNC_RESTART_WLAN ${COUNT}
else
# logger -t "${SYSLOG_PREFIX}" "check${COUNT} : passed. (${PING_LOSS}% ping loss)"
exit 0
fi

sleep ${RETRY_WAIT}
FUNC_CHK_MAIN `expr ${COUNT} + 1`
}

function FUNC_PING_CHK(){
PING_RESULT=`ping -q -c ${PING_COUNT} -W ${PING_TIMEOUT} ${PING_TARGET} |& \
grep "packets transmitted," | \
sed -e 's/^.* \([^ ]*\)%.*$/\1/' -e 's/[^0-9]//g'`
if [ -z "${PING_RESULT}" ];then
PING_RESULT=100
fi
echo ${PING_RESULT}
}

function FUNC_RESTART_WLAN(){
CHK_COUNT=${1}

logger -t "${SYSLOG_PREFIX}" "check${CHK_COUNT} : ifdown ${WLAN_IF}"
/sbin/ifdown ${WLAN_IF}

sleep ${IF_UP_DOWN_WAIT}

logger -t "${SYSLOG_PREFIX}" "check${CHK_COUNT} : ifup ${WLAN_IF}"
/sbin/ifup ${WLAN_IF}
}

### end subroutines ###################################################


FUNC_CHK_MAIN 1
exit 1
raspiはストレージがSDカードなので、ping成功時にログを吐くのは止めておいた方がいいだろうと思って、該当箇所のloggerはコメントアウトしてある。
デバッグするときはコメントアウトを外しておくといいかもね。

これを適当な場所に保存しておく。 例えば /root/script/check_wlan0.sh とか。


setting

定期的にrootで実行したいので、こういうときはcronを使う。
pi% sudo crontab -e

MAILTO=""

*/10 * * * * /root/script/check_wlan0.sh
上記の例では10分間隔で繰り返す。 まぁとりあえずこれでやりたい事は出来てる。


interfacesにautoとかあるいは他のナニカのキーワードを書いておけばイイカンジに再接続してくれるのかな? よくわかんないっすね。 ただこのスクリプトを使えば最後にはrebootまでしてくれる(やってしまう)ので、用途によってはこっちのが向いてたりしますね。 yes, in my case.
 
 
コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/253-e32bb3f4
≪ トップページへこのページの先頭へ  ≫
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。