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]
などのセクションで構成されます。
[Unit]
セクション- 説明: サービスのメタデータと依存関係を定義します。
- 主なキー:
Description
: サービスの簡単な説明。After
,Before
: 他のユニットとの依存関係。
- 例:makefileCopy code
[Unit] Description=My Custom Service After=network.target
[Service]
セクション- 説明: サービスの実行に関する詳細を定義します。
- 主なキー:
ExecStart
: サービス起動時に実行するコマンド。ExecStop
: サービス停止時に実行するコマンド。Restart
: サービスが失敗した場合の再起動の挙動。
- 例:javascriptCopy code
[Service] ExecStart=/usr/bin/my_service Restart=always
[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
ファイルを作成したら、以下のようにファイル名を付けて保存します。
[ユニットファイル名].service
ユニットファイルの内容解説
#!/usr/bin/env python3
- この行はシバン(shebang)と呼ばれ、スクリプトがPython 3で実行されるべきであることを指定しています。
[Unit]
セクションDescription=Obtain IP address at startup and notify Line.
- このサービスが何をするのかを簡潔に説明しています。
[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で実行されます。(実際にファイルを配置するパスに変更してください)
- サービスが起動すると、このコマンドが実行されます。具体的には、
[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円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。
それでは、また次の記事でお会いしましょう。
コメント