Python & Raspberry Pi 開発ブログ ☆彡

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

Systemd:Pythonプログラムを自動起動する

今回はpythonプログラムをRaspberry Pi起動時に自動起動する方法を紹介したいと思います。Raspberry Pi起動時からpythonプログラムをサービスとして常駐させるという使い方は多いと思います。そういう場合にとても便利な機能です。それで説明していきます。

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コマンドで指定したpythonプログラム(ExecStartで指定した/home/pi/test.py)が起動しているか確認します。起動後、何もしなくてもpythonプログラムが実行していれば、成功です。

〇test.pyのコード

import time
while True:
time.sleep(1)

〇psコマンドの結果

ps command

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ファイルを生成し、ブラウザで表示してください。

$ systemd-analyze plot > systemd.svg

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

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

[Service] Restart、Typeパラメータ

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

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

ラズパイ 設定に戻る
トップに戻る