Edited at

Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説


Raspberry Piで自動起動する方法

 この記事は変デジ開発室の記事から移行したものです。

 Raspberry Piにはプログラムを自動起動する方法がたくさんあります。それぞれ特徴があるので、自分が簡単と思う順にまとめていきます。自分もブートの仕組みちゃんと全部理解できていないので徐々にまとめていこうと思います。

 大きくは以下5つがあるという認識です。


  1. /etc/rc.local

  2. autostart

  3. crontab @reboot

  4. /etc/init.d

  5. systemd


/etc/rc.local

 /etc/rc.localに自動起動したいコマンドやスクリプトを書くと、起動時に実行されます。好きなエディタで編集しましょう(以下はvimの例です)。

$ sudo vim /etc/rc.local

ファイルの最後にexit 0とあるので、その手前に起動時に実行したいコマンドをを書きます。hogehogeというコマンドだったら

hogehoge

exit 0

 と書きます。自作のスクリプト(例えば hogehoge.shとします)を使いたい場合は /usr/local/bin/hogehoge.shに置いて、/etc/rc.localに以下のように書くのがよいかと思います。

hogehoge.sh

exit 0

 なお、/etc/rc.localに書かれたコマンドは、root権限で実行されます。


crontab @reboot

cronを使って起動時にプログラムを走らせることもできます。ユーザー権限でプログラムが実行されるので、root権限で走ったら困るようなプログラムに使えます。例えばROS(Robot Operating System)のノードを立ち上げるときは、crontabを使うのも良いと思います。

 以下コマンドでcrontabを修正します。

$ crontab -e

 以下のように追記します

@reboot                  /home/pi/hogehoge.sh

 これで起動時にhogehoge.shが実行されます。


autostart を使用する方法

 いわゆるWindowsのスタートアップにあたるものです。GUIのプログラムを起動時に実行したいときに使います。以下でautostartというファイルを作成します。

$ vim ~/.config/lxsession/LXDE-pi/autostart 

 /home/pi/hogehoge.shを起動したい場合は、以下のように記載します。

@/home/pi/hogehoge.sh


/etc/init.d を使う方法

 Raspbian Wheezyまではこちらを使うことが推奨されていました。Raspbian Jessieからはsystemdが推奨されているので、ここでは詳細の説明は省略します。


systemd を使う方法

 Raspbian Jessieから推奨されている自動起動の方法です。サービスとして、起動したり、シャットダウンしたり、再起動したりもできるようになるので、真面目にプログラムをサービスとして管理したいならsystemdを使うのがよいです。

 以下webiopiを自動起動したいときの例を記載します。まず以下のようなwebiopi.serviceというファイルを作成します。

[Unit]

Description=WebIOPI
After=syslog.target

[Service]
Type=simple
WorkingDirectory=/usr/share/webiopi/htdocs
ExecStart=/usr/bin/python3 -m webiopi -l /var/log/webiopi -c /etc/webiopi/config
TimeoutStopSec=5
StandardOutput=null

[Install]
WantedBy = multi-user.target

 基本的には、Descriptionにサービス名、WorkingDirectoryに作業ディレクリ名、ExecStartに実行したいプログラムを記載すればよいです。他のオプションに関しては、systemdの仕様を調べて必要に応じて修正しましょう。作成したwebiopi.serviceは、/etc/systemd/system以下に移動してやります。例えば以下のコマンドで移動するとよいでしょう。

$ sudo mv webiopi.service /etc/systemd/system/

 あとは、以下コマンド実行すると、systemdを使ってサービスを起動することができます。

$ sudo systemctl start webiopi

 サービスを停止したいときは以下コマンドを実行しましょう。

$ sudo systemctl stop webiopi

 サービスの起動、停止が確認できたら、自動起動を設定しましょう。以下コマンドを実行します。

$ sudo systemctl enable webiopi

 これで起動時にサービスが自動で起動するようになります。自動起動をやめたい場合は以下です。

$ sudo systemctl disable webiopi


まとめ

 Raspberry Piで自動起動させる方法に関してまとめました。色々方法があるので用途によって使い分けましょう。それぞれ特徴がありますが、自分の中での選択の基準は以下です。


  • 手軽にとにかく自動で起動させたいなら /etc/rc.local

  • root権限で実行するとまずいプログラムは crontab @reboot

  • GUIのプログラムはautostart

  • しっかり管理したいならsystemd

  • 特別な事情があれば /etc/init.d


関連記事

Raspberry Piで作ったもの・やったことまとめ