Who is さくふわめろんぱん

さくふわめろんぱん(@skfwMelonpan)はロボットとか人工知能に興味があるパンです。
自分のために調べたことがみんなの役に立ったらいいなぁ。

2015年8月2日日曜日

RaspberryPi 起動したらプログラムが動いてほしい


RaspberryPiを買って、ずっとHDMIとかでディスプレイにつなげて使ってる人は稀ですよね。最初の設定でちょっと使うけれど、ネットワークの設定とかが済んだらパソコンからssh接続したほうが楽ですからね。

そうやってRaspberryPiを使ってて不安なのは、起動はしてるだろうけど、どこまで起動したかわからない。ssh接続したいけど、もう起動したかな・・もうちょっとかな・・。っていうのを毎回考えてしまいます。

それとはまた別で、自律ロボットのためにRaspberryPiを使っている人は分かるとおもうのですが、毎回電源入れてネットワークで接続してプログラムを起動するというのは手間です。それに、ネットワークがない場所(屋外とか)で動かすときや万が一ネットワークがダメなときに、電源を入れ直したら動作するようになっていて欲しいのです。

少なくとも「GPIOピンに繋げたスイッチを押すとプログラムが動き出す」っていうプログラムが起動して欲しいわけです。(ややこしいけどわかるかな?)

最初に書いた起動してるか分からない問題も、起動したらLEDを点滅させるとかネットワークでなんかするとかいうプログラムを書けば解決ですよね。

起動したらプログラムが動く方法その1

Linuxが起動するときに実行させる

LinuxのOSが起動するときに、最初から入ってるプログラムがばーっと動いて実行されます。RaspberryPiをディスプレイに繋げて起動したときに見える大量の文字列は、初期設定とかネットワーク接続とかいろんな作業をしてくれているわけです。

そのうちの1つとして実行する方法があります。
/etc/rc.local
というファイルの exit 0 の前に書き込む方法です。
このファイルで実行するのは初期設定の変更関係にしましょう。
ネットワークのIPアドレスだとかの設定に使えます。

起動したらプログラムが動く方法その2

ログインしたときに実行させる

もう1つの方法はログインしたときに実行する方法です。
ログインしたときにプログラムを起動するのはMacやWindowsでもある機能ですよね。
/etc/profile
にrc.localと同様に書き込むとログイン時に動作します。
あとは起動したときに自動ログインをするようにすればよいですね。
/etc/inittab  の
1:2345:respawn:/sbin/getty 38400 tty1
をコメントアウトしてその下に
1:2345:respawn:/bin/login -f ユーザー名 tty1 </dev/tty1>/dev/tty1 2>&1
って書いて保存っと。

これで起動→ログイン→プログラムが起動という流れになります。
ちなみにsshでログインするともう1つ余分にプログラムが回るので注意。

ちょっとしたメモ

Pythonのプログラムを起動するとき普通は、
$    Python ./program.py
見たいなコマンドにしますが、GPIOとかファイル操作をするときは実行権限がないとプログラムが途中で止まってしまいます。なので自動実行させる時はsudoで実行しましょう。
$   sudo python ./program.py
それと、バックグラウンド処理(背後でプログラムを動かして他の処理をする) をしたい場合はアンパサンドをつけましょう。
$   sudo python ./program.py &
sudoで実行することのもう一つの利点は、sudoのプロセスを止めるとプログラムが止まってくれることです。 killallってコマンドで一斉停止ができます。
$   sudo killall sudo
なんかプログラムが暴走してるときとかに便利です。