#Raspberry Piで起動時プログラム起動
Raspberry Piのプログラムを実行するのに、いちいちRaspberry Piのコマンドを開いて実行するのって不便ですよね。今回は起動時にsystemdというものを使って、プログラムを自動起動する方法を簡潔にまとめます。
#systemdについて
systemdはLinuxの起動処理やシステム管理を行う仕組みです。サービスを1つのシェルスクリプトではなくUnitという単位で、ファイルとして管理します。このため処理を細分化でき個別に実行することが可能です。また処理ごとの流れを明確にすることが出来るので、並行処理も可能です。今回は起動時のプログラムの実行の設定方法を扱いますが、起動時以外にも終了時やタイマーなどのトリガーでも実行が可能です。
#設定の流れ
設定の流れですが、基本的にはserviceファイルというものを作成して、serviceファイルを使える状態にすることで可能です。
##serviceファイル作成
serviceファイルは/etc/systemd/system/のディレクトリに作成してください。よって以下のコマンドを実行します。test.serviceのtestの部分は好きな名前で大丈夫です。
$ sudo nano /etc/systemd/system/test.service
中には以下のように記述します。
[Unit]
Description = do test
[Service]
ExecStart=/home/pi/systemd/test.sh
Restart=always
Type=simple
User=pi
[Install]
WantedBy=multi-user.target
[unit]
ユニット自体の定義をします。
Descriptionは動作に影響しないので、自分で決めてください。
[service]
ここで起動時のコマンドを決定します。RestartとTypeで設定すればサービスが停止した際の再起動などの設定もできます。また、Userで実行権限も設定できます。デフォルトではsudo権限で実行するのに加え、systemdには権限に応じたmoduleしか探しません。従って、user権限でpip installしたmoduleはno moduleと判定されてしまうので、sudo pip installするか、サービスファイルの権限の設定をpiに変えてください。
ExecStart: サービス起動コマンド
Type: サービスプロセスの起動完了の判定方法。デフォルトは「simple」。
「simple」: ExecStartで指定したコマンドを実行した時点でサービスが立ち上がったと判断
Restart: サービスプロセス停止時の再起動条件(デフォルトは「no」)
「always」: 常に再起動を試みる
User: 実行する権限(デフォルトは「root」)
[install]
このセクションは決まり文句として書いてください。
これがないと次の動作ができません。
#サービスファイルの再読み込み
サービスファイルが完成したら、デーモンに読み込みを行います。
$ systemctl daemon-reload
#サービスファイル動作確認
サービスファイルは以下のコマンドで起動停止が可能です。実行時は.seviceを抜いて自分の設定したサービスファイル名を入力してください。
$ systemctl start test(起動)
$ systemctl stop test (停止)
#serviceファイルを有効化する
動作の確認ができたら、以下のコマンドでサービスファイルを起動時に実行する(enable)するか、オフにするか(disable)にするかを決定します。
$ systemctl enable test (デーモン起動)
$ systemctl disable test (デーモン停止)
#起動時の実行状況をコマンドで確認する
起動時に実行した場合、コマンド上に流れないのでエラーが起きていても確認ができません。起動後、このコマンドを実行すれば、起動時のプログラムの実行のログが確認できます。
sudo LANG=C systemctl status -l test.service
#参考にしたもの
今回は以下の記事を参考にしました。
https://qiita.com/sinsengumi/items/24d726ec6c761fc75cc9
https://qiita.com/molchiro/items/ee32a11b81fa1dc2fd8d
https://tomosoft.jp/design/?p=11697
https://qiita.com/marumen/items/e4c75a2617cb5d0113ce
https://www.souichi.club/technology/systemd/
#おわりに
今回でRaspberry Piで起動時の自動実行が可能になりました。自動実行ができれば、起動時にslackbotを起動させて、スマホからの操作も可能になります。より実用的にRaspberry Piを扱うことができそうです。