自力でネットワークに復活してほしい

前回の記事で導入した Raspberry Pi でしたが、うちの無線LANが悪いのかなんなのか、数時間経つとネットワークからいなくなってしまう症状がありました。
ときどき気付いて電源を挿し直すのとかだるいので、自力で復活してくれるように設定しました。

本記事の目次

方針としては以下の通りです。

ping は送った対象が生きているか確認するものですが、今回はルータに送り、返ってこなければ自分が死んでいると判断します。
ちなみに送る対象はルータとしていますが、ネットワークに常駐している機器なら他のものでも問題ありません。

やること

  • ルータの IP アドレス確認
  • bashを書く
  • cron で毎分実行

ルータの IP アドレス確認

Raspberry Pisshして入れたら、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に関しては結構苦労させられたので思い出深いです。