Raspberry Pi LiteでPythonスクリプトを自動起動する全手順
動作環境
- OS: Raspberry Pi OS 32bit Lite
- 対象ファイル:
/home/pi/scripts/dht22.py - 仕組み:
systemd(サービス機能)
1. 必要なツールとライブラリのインストール
Raspberry Pi OS Liteには初期状態で pip3 が入っていないため、まずパッケージ管理ツールの導入とライブラリの強制インストールを行います。
# パッケージリストの更新と pip3 のインストール
sudo apt update
sudo apt install -y python3-pip
# センサー制御に必要なライブラリをシステム全体に強制インストール
sudo pip3 install adafruit-circuitpython-dht --break-system-packages
2. 自動起動用設定ファイル(サービス)の作成
システムにプログラムを登録するための設定ファイルを作成します。
sudo nano /etc/systemd/system/dht22.service
緑の部分が重要でdht22.pyを動かすので、わかりやすいネーミングにした。
開いた空の画面に、以下の内容を1行目の先頭からズレがないように貼り付けます。
[Unit]
Description=DHT22 Auto Start Script
After=network.target
[Service]
ExecStart=/usr/bin/python3 /home/pi/scripts/dht22.py
WorkingDirectory=/home/pi/scripts/
StandardOutput=inherit
StandardError=inherit
Restart=always
RestartSec=5
User=pi
[Install]
WantedBy=multi-user.target
青色文字の部分が重要。ここを間違えてエラーを何度も起こした。
【保存して閉じる操作方法】
Ctrl+Oを押すEnterを押す(上書き保存)Ctrl+Xを押す(編集画面を終了)
3. 自動起動の有効化と実行
作成した設定ファイルをシステムに認識させ、ラズパイの電源を入れたら自動で動くように設定します。
# 新しい設定ファイルをシステムに認識させる
sudo systemctl daemon-reload
# 電源 ON 時に自動起動するよう有効化する
sudo systemctl enable dht22.service
# 今すぐプログラムを裏で起動する
sudo systemctl start dht22.service
4. 動作確認と状態チェック
正しく動いているか、いつでも以下のコマンドで状況を確認できます。
sudo systemctl status dht22.service
- 成功時の表示: 画面に緑色の文字で
Active: active (running)と表示されます。 - 終了方法: ステータス画面から元の入力画面に戻るには、キーボードの
qを押します。
動いているサービスの一覧を見る(基本)
現在、裏で元気に動いている(起動中の)システムだけを一覧表示します。
systemctl list-units --type=service --state=running
- 見方: 私たちが作った
dht22.serviceや、ラズパイのネットワーク、時計合わせなどのシステムがずらりと並びます。 - 終了方法: キーボードの
qを押すと元の画面に戻ります。
2. 「自動起動」が有効になっているサービス一覧を見る
電源を入れたときに自動で立ち上がるように設定されている(enabled になっている)サービスをすべて表示します。
systemctl list-unit-files --type=service --state=enabled
- 見方: ここに
dht22.serviceがあれば、次回電源を入れたときも確実に自動起動します。
3. 動いている「Pythonプログラム」だけをピンポイントで見る
システム全体ではなく、「自分が動かしているPythonが本当に起動しているか」だけを知りたい場合は、プロセスを確認するコマンドが便利です。
ps aux | grep python3
- 見方: 画面に
/home/pi/scripts/dht22.pyという文字が含まれる行が表示されれば、そのプログラムが現在メモリー上で動いています。
💡 便利な豆知識:特定のサービスだけを狙って調べる
今回作った dht22.service の状態をピンポイントで確認するときに使った以下のコマンドが、実は一番よく使われます。
sudo systemctl status dht22.service
他のシステム(例えばSSHなど)を調べたいときは、後ろの名前を ssh.service などに変えるだけで、同じように詳細な起動状態(動いているか、エラーがないか)を見ることができます。
❌ 間違えたポイントと💡 正しい対策
1. サービス名(ファイル名)の不一致
- 起きたこと:
myscript.serviceという名前でファイルを作ったのに、有効化するときにsudo systemctl enable dht22.serviceと入力したため、「ファイルが存在しない」というエラーになりました。 - 対策:
sudo nanoで作ったファイル名と、systemctlで指定する名前は完全に一致させる必要があります。
2. セクション名の記述ミス(構文エラー)
- 起きたこと: ファイルの先頭に
[Unit]や[Service]を書く際、スペースが混ざるなどして正しく認識されず、Assignment outside of section. Ignoring.(セクションの外に記述があります、無視します)というエラーが発生しました。 - 対策: 設定ファイルの
[...]は大文字・小文字を正確に、かつ行の先頭からスペースを入れずに記述する必要があります。
3. フォルダ名(パス)の単数形・複数形の間違い
- 起きたこと: サービスファイル内に
/home/pi/script/(単数形)と書きましたが、実際のラズパイ内のフォルダは/home/pi/scripts/(複数形、最後にsがある)だったため、status=200/CHDIR(フォルダが見つからない)というエラーになりました。 - 対策: フォルダやファイルの場所を指定するときは、事前に
pwdコマンドなどで「実際の正確な絶対パス」を確認してから書き写すのが確実です。
4. 実行に必要なライブラリ(Pythonモジュール)の不足
- 起きたこと: 自動起動の設定自体は合っていましたが、プログラムを動かすために必要な
boardライブラリがラズパイにインストールされておらず、プログラムが内部でエラー(ModuleNotFoundError)を起こして停止していました。 - 対策: 自動起動を設定する前に、まずは手動(
python3 ○○.py)でエラーなく動く状態を完成させておく必要があります。
5. パッケージ管理ツール(pip3)の未導入
- 起きたこと: 足りないライブラリを入れようとして
pip3 installを実行しましたが、Raspberry Pi OS Lite(最小構成版)だったため、そもそもpip3コマンド自体がラズパイに入っておらずエラーになりました。 - 対策: Lite版OSを使うときは、まず
sudo apt install python3-pipでツール自体をインストールしてからライブラリを追加します。
🛠️ 今後のための教訓
(一発で成功させるルール)
次回、新しいスクリプトを自動起動させるときは、以下の順番で進めると絶対に失敗しません。
- 手動で動かす:
python3 /パス/ファイル名.pyで完璧にエラーなく動くか確認する。 - パスをメモする:
pwdを使って、フォルダの場所をコピーしておく。 - サービスを作る: メモしたパスを貼り付けてサービスファイルを作る。