Raspberry Pi & Python 開発ブログ ☆彡

Raspberry PiとPythonの基本的な使い方をわかりやすく解説。初心者、入門者必見!!

Raspberry Piでsystemdを使ってpythonを自動実行する

systemd

この記事の内容は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コマンドの結果

systemd ps result

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

下記のように起動順が表示されます。 systemd analyze plot

これでサービスの起動順を調べて、After= もしくはBefore=の後にサービスを記載します。また、余談ですが、svgファイルを見ると不要なサービスが起動していないかどうかも確認できます。

[Service] Restart、Typeパラメータ

Restartパラメータで、プロセス終了時の動作を指定することができます。一度だけコマンドを実行したい場合は、Typeパラメータで設定できます。

[Service]
‥‥‥
‥‥‥
Restart=always # プロセスが勝手に終了しても、自動的に再起動する。デフォルトはnoで再起動しない。
Type=oneshot # 一度だけ指定のコマンドを実行する

他にもパラメータはたくさんありますが、書ききれないので必要に応じて、調べて追加して見てください。以上で説明を終わります。