自力でネットワークに復活してほしい
前回の記事で導入した Raspberry Pi でしたが、うちの無線LANが悪いのかなんなのか、数時間経つとネットワークからいなくなってしまう症状がありました。
ときどき気付いて電源を挿し直すのとかだるいので、自力で復活してくれるように設定しました。
本記事の目次
方針としては以下の通りです。
ping は送った対象が生きているか確認するものですが、今回はルータに送り、返ってこなければ自分が死んでいると判断します。
ちなみに送る対象はルータとしていますが、ネットワークに常駐している機器なら他のものでも問題ありません。
やること
- ルータの IP アドレス確認
- bashを書く
- cron で毎分実行
ルータの IP アドレス確認
Raspberry Pi にsshして入れたら、netstat -rnしてルータの IP アドレスを調べます。
netstat -rn
そうしたら
Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 10.249.*.* 0.0.0.0 UG 0 0 0 wlan0 10.249.*.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
こういう感じになると思います。
Gatewayの項目で 0.0.0.0 じゃない数字が書いてあったらそれがルータの IP アドレスになります。
bash を書く
私はRaspberry Piのユーザディレクトリの直下に"reconnect"というディレクトリを作成しましたが、置く場所はどこでもいいと思います。
内容としては単純で、ping した結果が正常でなければ日付を log に残しネットワークインターフェイスを再起動するだけです。
#!/bin/sh ping -c 1 (ルータのIPアドレス) if [ $? -ne 0 ]; then echo `date` >> /home/(ユーザ名)/reconnect/log /sbin/ifconfig wlan0 down /sbin/ifconfig wlan0 up fi
以上を "reconnect.sh" など適当な名前で保存します。
また、実行権限を付与する必要もあります。
sudo chmod 755 reconnect.sh
これで実行するソースはできました。
cronで毎分実行
cronとは日付や時間を指定すると実行してくれるマンです。
sudo crontab -e
と入力すると、root権限で実行されるcronを追加できます。
ここに以下を追記します。
* * * * * /home/(ユーザ名)/reconnect/reconnect.sh >>/dev/null 2>>/home/(ユーザ名)/reconnect/errlog
実はこの方法はあまりよくなくて、誤ってcrontab -r としてしまうと全cronが消失してしまうという危険と隣合わせとなっています。
本記事では横着しましたが、うっかりさんや厳密な方はテキストファイルを読み込ませるなど、他の安全な方法を取るべきだと思います。
さて、以上で自力で復活できるよう設定できたと思います。
それでも死んでしまう、という方は以下の原因・対処法が考えられます。
- ルータへの ping が通っていない
→ ラズパイから手動で ping してみる、ルータのIPアドレスを確認する
- bashファイルが実行されていない(cronがうまくいっていない)
→ cronの記法を確認する、もっと結果が見やすいスクリプト(echoなど)でcronが正しく動くか検証してみる
感想
bashを書いたりcronについて調べたり、ifconfigについて調べたりといろいろ要素が多かったです。
特にcronに関しては結構苦労させられたので思い出深いです。