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

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

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

1. /etc/rc.local
1. autostart
1. crontab `@reboot`
1. /etc/init.d
1. systemd

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

```sh
$ 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を修正します。

```sh
$ crontab -e
```

　以下のように追記します

```
@reboot                  /home/pi/hogehoge.sh
```

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

## autostart を使用する方法
　いわゆるWindowsのスタートアップにあたるものです。GUIのプログラムを起動時に実行したいときに使います。Raspbian Buster以降とそれ以前で設定方法が異なるので注意して下さい。

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

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

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

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

```sh
$ sudo apt update
$ sudo apt install x11-apps
```

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

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

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

![xeyes_autostart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/c87e8dfd-ead5-3bf0-2c08-af032d69ba03.png)

参考：[起動時にアプリを自動実行したいのですが](https://www.raspberrypi.org/forums/viewtopic.php?t=249620)

### 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](https://in-thread.sonic-pi.net/t/sonic-pi-for-standalone-installations/225/4)



## /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`以下に移動して読み込む必要があります。具体的には次のコマンドで移動と読み込みを行います。

```sh
$ sudo mv webiopi.service /etc/systemd/system/
$ sudo systemctl daemon-reload
```

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

```sh
$ sudo systemctl start webiopi
```

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

```sh
$ sudo systemctl stop webiopi
```

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

```sh
$ sudo systemctl enable webiopi
```

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

```sh
$ sudo systemctl disable webiopi
```

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

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

# 自動起動に関する記事
[ラズパイの CUI で起動時に CLI アプリをフォアグラウンドで自動起動させて入力待ちにさせる](https://qiita.com/KEINOS/items/b8999feda7397f39c3c4#_reference-55c359cb2baf8c0d8615)

# 関連記事
https://karaage.hatenadiary.jp/entry/2015/09/10/073000

https://zenn.dev/karaage0703/articles/5b9093e1b7820c

# 変更履歴
- 2022/02/15 微修正
- 2020/01/26 Raspbian Buster以降でのautostartでの自動起動に関して追記