Raspberry Pi で起動時にPythonプログラムを自動実行する方法

  • URLをコピーしました!

※本ページはアフィリエイト広告を利用しています

Raspberry Piは多くのプロジェクトで活躍する便利なデバイスですが、その真価を発揮するためには、起動時に特定のプログラムを自動で実行する設定がしばしば必要です。

特に、リモートでRaspberry Piを操作する場面では、IPアドレスを自動で取得して通知するようなプログラムが役立つことがあります。

カピパラのエンジニア

ラズパイはIP調べるのがめんどくさいんだよね。

猫のエンジニア

ディスプレイやキーボードを繋いで確認しないといけないもんね。

今回の記事では、Raspberry Piで起動時にPythonプログラムを自動実行する手順について詳しく解説します。

この自動実行されるPythonコードの中で、IPアドレスを調べて送信する処理を実装しておけば、SSH、VNCなどでRaspberry Pi を操作する際に非常に便利ですので、ぜひ試してみてください。

この記事でわかること
  • systemd ユニットファイルの概要
  • systemd ユニットファイルの作成
  • IPアドレスをLINEに送信するためのPythonコード
  • ユニットファイルのサービスへの登録方法
目次

systemd ユニットファイルとは

systemdユニットファイルは、Linuxシステムプロセス(サービス)を管理するための設定ファイルです。

systemdは、現代の多くのLinuxディストリビューションで標準的に使用されているinitシステム(初期化システム)であり、システム起動時にどのプロセスをどのように起動するか、または後から手動でプロセスを制御する際にも使用されます。

ユニットファイルは主にINIファイル形式で書かれ、[Unit][Service][Install] などのセクションで構成されます。

systemdサービスファイルの主要なセクション
  1. [Unit] セクション
    • 説明: サービスのメタデータと依存関係を定義します。
    • 主なキー:
      • Description: サービスの簡単な説明。
      • After, Before: 他のユニットとの依存関係。
    • :makefileCopy code[Unit] Description=My Custom Service After=network.target
  2. [Service] セクション
    • 説明: サービスの実行に関する詳細を定義します。
    • 主なキー:
      • ExecStart: サービス起動時に実行するコマンド。
      • ExecStop: サービス停止時に実行するコマンド。
      • Restart: サービスが失敗した場合の再起動の挙動。
    • :javascriptCopy code[Service] ExecStart=/usr/bin/my_service Restart=always
  3. [Install] セクション
    • 説明: サービスがどのターゲット(起動レベル)で有効になるかを定義します。
    • 主なキー:
      • WantedBy: このサービスが依存するターゲット。
    • :csharpCopy code[Install] WantedBy=multi-user.target

このサービスファイルを /etc/systemd/system ディレクトリに保存することで、systemctl コマンドを用いてサービスの起動、停止、再起動、状態確認などが行えます。

実行対象となるPythonのプログラム

PythonコードからLINEに通知を送信するためLINE NotifyというWebサービスを利用します。

LINE Notifyの登録方法を以下の記事で解説していますので予めトークンを取得しておいて下さい。

今回、サービスでの自動起動の対象となるPythonコードを使用します。

このコードが実行されると、自動的にIPアドレスを取得し、コードの中で指定されたLINEアカウントにメッセージとして送信します。

こちらのPythonファイルをあらかじめRaspberry Pi に転送しておいてください。

systemd ユニットファイルの作成

ここからは、実際に自動起動に使用するユニットファイルを作成していきます。

作成したユニットファイル

今回作成したユニットファイルは以下の通りです。

#!/usr/bin/env python3

[Unit]
Description=Obtain IP address at startup and notify Line.

[Service]
Type=simple
User=pi
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
ExecStart=/usr/bin/python3 /home/pi/work/Line/send-ip-linux.py


[Install]
WantedBy=multi-user.target

8行目のユーザー名と、10行目のファイルパスは実際に使用しているものに変更してください。

ファイルを作成したら、以下のようにファイル名を付けて保存します。

[ユニットファイル名].service

ユニットファイルの内容解説

  1. #!/usr/bin/env python3
    • この行はシバン(shebang)と呼ばれ、スクリプトがPython 3で実行されるべきであることを指定しています。
  2. [Unit] セクション
    • Description=Obtain IP address at startup and notify Line.
      • このサービスが何をするのかを簡潔に説明しています。
  3. [Service] セクション
    • Type=simple
      • サービスのタイプをsimpleとしています。これは、ExecStartで指定されたコマンドが直接実行されることを意味します。
    • User=pi
      • このサービスはpiユーザーとして実行されます。(Linuxで使用しているユーザー名に変更してください)
    • Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
      • 環境変数PATHを設定しています。
    • ExecStart=/usr/bin/python3 /home/pi/work/Line/send-ip-linux.py
      • サービスが起動すると、このコマンドが実行されます。具体的には、/home/pi/work/Line/send-ip-linux.py スクリプトがPython 3で実行されます。(実際にファイルを配置するパスに変更してください)
  4. [Install] セクション
    • WantedBy=multi-user.target
      • このサービスはmulti-user.targetによって起動されるように設定されています。これは、多くのユーザーがシステムを使用できるレベルでこのサービスが起動することを意味します。

サービスの登録と自動起動設定

最後にサービスの登録と自動起動設定を行います。

systemdのサービスを管理するには、systemctl コマンドを使用します。

サービスの有効化と起動

以下のコマンドでサービスを有効化し、起動します。

sudo systemctl enable [ユニットファイル名].service
sudo systemctl start [ユニットファイル名].service

これで実際にPythonコードが実行されていれば成功です。

その他のsystemctlコマンド

今回使用した以外にもsystemctlは以下のようなものがあります。

コマンド説明使用例
systemctl start指定したサービスを起動するsudo systemctl start [ユニットファイル名]
systemctl stop指定したサービスを停止するsudo systemctl stop [ユニットファイル名]
systemctl enable指定したサービスをシステム起動時に自動で起動するよう設定するsudo systemctl enable [ユニットファイル名]
systemctl disable指定したサービスの自動起動を無効にするsudo systemctl disable [ユニットファイル名]
systemctl status指定したサービスの状態を確認するsudo systemctl status [ユニットファイル名]
systemctl restart指定したサービスを再起動するsudo systemctl restart [ユニットファイル名]

サービスの実行テスト

今回は動作テストとして、実際に私が使用しているロボットのコントローラとして搭載されているRaspberry Pi でテストしてみました。

以下が実際のロボットの写真です。HDMIケーブルが差さっているのがRaspberry Pi 3です。

実行結果

ロボットの電源をONにし、しばらくしてLinuxが起動すると以下のようにスマホのLINEにIPアドレスが送信されてきました。

これで毎回ディスプレイとキーボード、マウスを繋いでIPアドレスを確認する必要が無くなりました。

よくあるエラーとその対処法

サービス登録、実行時に良く起こるエラーとして以下のようなものがあります。
(実際に私の環境でも発生しました)

  • Exec format error: Shebangが不正、またはPythonのパスが間違っている。
  • Permission denied: スクリプトに実行権限がない。

エラーログの確認方法

エラーログは以下のコマンドで確認できます。

sudo journalctl -u send-line.service

まとめ

本記事では、Raspberry Piで起動時にPythonプログラム自動で実行するための手順を解説しました。

systemdというLinuxの標準的なサービス管理ツールを用いて、この設定を行う方法を学びました。

特に、systemctl コマンドの使い方について詳しく見てきました。

Raspberry Pi 使用する際の手間を大幅に削減できますので、ぜひ活用してみてください。

また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。

スキルアップや副業にぜひ活用してみてください。

スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。

講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。

それでは、また次の記事でお会いしましょう。

著:山内 直, 著:大久保 竣介, 著:森本 梨聖, 監修:太田 昌文
¥2,618 (2024/11/17 20:48時点 | Amazon調べ)
よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次