この記事の内容はRaspberry Pi 4と3の両方で動作確認済みです
ブログ管理者のP. Hです!
今回はpythonプログラムをRaspberry Pi起動時に自動起動する方法を紹介したいと思います。Raspberry Pi起動時からpythonプログラムをサービスとして常駐させるという使い方は多いと思います。そういう場合にとても便利な機能です。
それではsystemdの使い方を説明していきます。
serviceファイルの作成
SystemdというLinuxの起動処理を管理する機能を使います。そのために、まず自動起動したいプログラムや設定等を記載したserviceファイルを作成します。
今回は例としてtest.serviceというファイル名で作成していきます(ファイル名は"任意の名前.service”になります。任意で問題ありませんので、わかりやすい名前を付けてください)。
まず、sudo nano /lib/systemd/system/test.service
コマンドで、test.serviceファイルを開きます(はじめての場合は、新規作成になります)。以下のように編集します。
[Unit] Description = test [Service] ExecStart=/usr/bin/python3 /home/pi/test.py Restart=always Type=simple [Install] WantedBy=multi-user.target
上記の"ExecStart"に自動実行したいpythonファイルのパスを記載します。今回は例として/home/pi/test.pyを自動実行する設定にしてあります。
サービスの起動/停止
下記コマンドで上記で作成したサービスを起動/停止することができます。
$ sudo systemctl start test.service <--- サービスを起動するコマンド $ sudo systemctl stop test.service <--- サービスを停止するコマンド
Raspberry Pi起動時にサービスを自動起動/停止する設定
下記コマンドで上記で作成したサービスをRaspberry Pi起動時に自動起動/停止することができます。
$ sudo systemctl enable test.service <--- サービスを自動起動するコマンド $ sudo systemctl disable test.service <--- サービスを自動停止するコマンド
systemctl enable設定をして、Raspberry Piを再起動します。ps aux
コマンドで指定したpythonプログラム(ExecStartで指定した/home/pi/test.py)が起動しているか確認します。起動後、何もしなくてもpythonプログラムが実行していれば、成功です。
- test.pyのコード
import time while True: time.sleep(1)
- psコマンドの結果
serviceファイルのセクション
[unit]、[service]、[Install]の3つのセクションがあります。かなりざっくりですが、以下のようになります。
- [unit] ⇒ サービスについて説明、競合するユニットの依存関係を指定
- [service] ⇒ 実行するサービスの動作やパラメータ指定
- [install] ⇒ サービスに依存するユニットを指定
詳細について知りたい方は、[unit]と[install]はman systemd.unitコマンド、[service]はman systemd.serviceコマンドでマニュアルを参照してください。
serviceファイルのパラメータ
上記のmanコマンドでマニュアルを見て頂いた方はわかると思いますが、パラメータはかなり数が多いです。よく使うと思われるものについて、紹介していきます。
[Unit] After/Beforeパラメータ
ネットワーク接続後に、サービスを起動したい等、サービスの起動順を制御したい場合は、よくあります。その場合、[Unit]セクションに以下のように記載することで、サービスの起動順を制御できます。
[Unit] Description=test After=xxx.service # xxx.serviceが起動した後に、本サービスが起動する。Beforeはその逆
現状、どういう順番でサービスが開始されているか確認するには、下記コマンドでsvgファイルを生成し、svgファイルをブラウザで開いてください。
$ systemd-analyze plot > systemd.svg
下記のように起動順が表示されます。
これでサービスの起動順を調べて、After= もしくはBefore=の後にサービスを記載します。また、余談ですが、svgファイルを見ると不要なサービスが起動していないかどうかも確認できます。
[Service] Restart、Typeパラメータ
Restartパラメータで、プロセス終了時の動作を指定することができます。一度だけコマンドを実行したい場合は、Typeパラメータで設定できます。
[Service] ‥‥‥ ‥‥‥ Restart=always # プロセスが勝手に終了しても、自動的に再起動する。デフォルトはnoで再起動しない。 Type=oneshot # 一度だけ指定のコマンドを実行する
他にもパラメータはたくさんありますが、書ききれないので必要に応じて、調べて追加して見てください。以上で説明を終わります。