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のプログラムを起動時に実行したいときに使います。Raspbian Buster以降とそれ以前で設定方法が異なるので注意して下さい。

Raspbian Buster以降でのautostart設定

 以下コマンドを実行して、autostartファイルの雛形を、ホームディレクトリのコンフィグにコピーします。

$ mkdir -p ~/.config/lxsession/LXDE-pi
$ cp /etc/xdg/lxsession/LXDE-pi/autostart ~/.config/lxsession/LXDE-pi/

 あとは、~/.config/lxsession/LXDE-pi/autostartファイルに実行したいコマンド名を追記するだけです。

 今回はxeyesというマウスを目玉で追うというアプリでテストしてみましょう。まずは以下コマンドでxeyesをインストールしておきます。

$ sudo apt update
$ sudo apt install x11-apps

 これで /usr/bin/xeyesとターミナルで実行すると目玉が表示されます。このアプリを自動起動するためには、以下コマンドを実行して、autostartファイルに/usr/bin/xeyesを追記します。

$ echo '/usr/bin/xeyes' >> ~/.config/lxsession/LXDE-pi/autostart

 この後、再起動すれば、以下のように自動的にxeyesが起動します。

参考:起動時にアプリを自動実行したいのですが

Raspbian Buster以前でのautostart設定

 以下コマンドでautostartというファイルを作成します。

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

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

@/home/pi/hogehoge.sh

autostartで自動起動に失敗するケース

 autostartだと、何故か自動起動できないプログラムもあります。その場合は、他の方法を使うと起動できるケースもあります。

 例えば、Sonic Piの場合は、私はautostartで起動できなかったので、以下の記事を参考にcrontabで自動起動をさせました。
Sonic Pi for standalone installations

/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/
$ sudo systemctl daemon-reload

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

$ sudo systemctl start webiopi

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

$ sudo systemctl stop webiopi

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

$ sudo systemctl enable webiopi

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

$ sudo systemctl disable webiopi

まとめ

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

  • 手軽にとにかく自動で起動させたいなら /etc/rc.local
  • ユーザー権限で実行させたいプログラムは crontab @reboot
  • GUIのプログラムはautostart
  • しっかり管理したいならsystemd
  • 特別な事情があれば /etc/init.d

自動起動に関する記事

ラズパイの CUI で起動時に CLI アプリをフォアグラウンドで自動起動させて入力待ちにさせる

関連記事

変更履歴

  • 2022/02/15 微修正
  • 2020/01/26 Raspbian Buster以降でのautostartでの自動起動に関して追記