日記とか、工作記録とか

自分に書けることを何でも書いてゆきます。作った物、買ったもの、コンピュータ系の話題が多くなるかもしれません。

メモ:Rasbian+mini-httpdの遅延起動

f:id:WindVoice:20150503183324g:plain
非常にこまかい、ノウハウとも言えないようなtipsですが……

raspberry pi 2でセンサー情報を取得してから、それをmathematicaでグラフにして、mini-httpdを使ってWebページとして結果を見られるようにしています。

mini-httpdはRasbian OSが起動したときに自動で起動して欲しいわけですが、/etc/init.d/mini-httpdスクリプトを配置して、/etc/rc?.d/S99mini-httpdにリンクを張る、などとしてもなぜか自動起動されず、困っていました。

試しに手動でsudo /etc/rc2.d/S99mini-httpd start などとすると起動します。ますます訳がわかりません。この状態でしばらく手詰まりとなっていたのですが、やっと回避方法を見つけることができました。ヒントは/var/log/daemon.logでした。

493 May  3 03:40:21 raspberrypi wpa_supplicant[1735]: wlan0: Trying to associate with a4:12:42:96:3d:aa (SSID='aterm-cae33a-g' freq=2417 MHz)
494 May  3 03:40:21 raspberrypi wpa_supplicant[1735]: wlan0: Association request to the driver failed
495 May  3 03:40:21 raspberrypi mini-httpd[1875]: bind 192.168.10.104 - Cannot assign requested address
496 May  3 03:40:21 raspberrypi mini-httpd[1875]: can't bind to any address
497 May  3 03:40:21 raspberrypi wpa_supplicant[1735]: wlan0: Associated with a4:12:42:96:3d:aa
498 May  3 03:40:21 raspberrypi wpa_supplicant[1735]: wlan0: WPA: Key negotiation completed with a4:12:42:96:3d:aa [PTK=TKIP GTK=TKIP]
499 May  3 03:40:21 raspberrypi wpa_supplicant[1735]: wlan0: CTRL-EVENT-CONNECTED - Connection to a4:12:42:96:3d:aa completed (auth) [id=1 id_str=]

よく見ると、無線LAN(wpa_supplicant)の起動よりもまえにmini-httpdが起動しようとしています。このため、mini-httpdはcan't bind to any addressというエラーになってしまっています。無線LANの開通自体、手探りでやりましたから何か悪影響がでているのでしょうか……

windvoice.hatenablog.jp

ネットワークはrcS.dで起動している(はず)なので、なぜここで順番が前後してしまっているのか、よくわかっていないのですが、ともかくこれが原因とわかったので、mini-httpdを少し待ってから起動するように調整しました。"sleep 10"を追加という、わかりやすく、かつ泥臭い方法です。

# Functions
start() {
        sleep 10
        if [ "$START" = "1" ]
        then
                echo -n "Starting $DESC: "
                start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
                        --exec $DAEMON -- $DAEMON_OPTS
                echo "$NAME."
        else
                printf "You have to edit /etc/mini-httpd.conf and\n/etc/default/mini-httpd before running mini-httpd!\n"
                exit 0
        fi
}

スマートなやりかたではありませんが、とりあえずこれで起動するようになりました。
残念ながら、根本的な解決方法はわかっていません。