しろふくろうず (しろふくろーず)

修繕に関するDIYをメインに趣味や時事ネタなども

ラズベリーパイ pythonプログラム(OpenCVで表示しつつ)の自動起動方法の見直し autostart.desktopからsystemdへ

こんにちは。DIYフクロウの備忘録です(・ω・)ノ

生成AI(今回はGemini)のメモがたっぷり混じっています(・ω・)

raspberry pi で/etc/systemd/system.confを編集してウォッチドッグを有効化するために

#RuntimeWatchdogSec=off を RuntimeWatchdogSec=15 に変更した。まだ、再起動していないので有効にはなっていないが、dmesgでウォッチドッグが有効になっていることを確認するために、dmesg | grep watchdogのコマンドで確認した後、有効になっていれば、

 

pi@raspberrypi:~/.config/autostart $ cat windowpi.desktop 

[Desktop Entry]

Type=Application

Name=windowpy

 

Exec=lxterminal -e python3 /home/pi/TensorflowLite-bin/mobilenetv2ssd-sync-usbcam_rev16.py --model="/home/pi/TensorflowLite-bin/models/mobilenet_ssd_v2_coco_quant_postprocess.tflite"  --num_threads="1" --usbcamno="0"

 

に記載しているmobilenetv2ssd-sync-usbcam_rev16.pyがアプリケーションが例外などで終了したときに自動で再起動する設定(TFlite.service)に変更することを本ページの狙いとします(`・ω・´)v

 

本記事では User=pi としていますが、皆様の環境によって変えていただければ幸いです。

----------------------------------------------------------------------------------------------


1. ウォッチドッグの確認方法(再起動後)

dmesg | grep -i watchdog


2. TFlite.service の作成

 

sudo nano /etc/systemd/system/TFlite.service

 

[Unit]
Description=MobileNetV2 SSD TFlite with Terminal Display
# デスクトップ環境(GUI)が完全に準備できてから起動させる
After=graphical.target

[Service]
User=pi
Group=pi
WorkingDirectory=/home/pi/TensorflowLite-bin/

# GUIを表示するための「おまじない」
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/pi/.Xauthority
Environment=PYTHONUNBUFFERED=1

# lxterminal を開き、その中で Python を実行
# --geometry=80x24 などでサイズ指定も可能(任意)
ExecStart=/usr/bin/lxterminal --geometry=100x30 -e "/usr/bin/python3 /home/pi/TensorflowLite-bin/mobilenetv2ssd-sync-usbcam_rev16.py --model='/home/pi/TensorflowLite-bin/models/mobilenet_ssd_v2_coco_quant_postprocess.tflite' --num_threads='1' --usbcamno='0'"

# アプリが落ちたら5秒後に再起動
Restart=always
RestartSec=5s

[Install]
# マルチユーザーモードではなく、グラフィカルモード(GUI)をトリガーにする
WantedBy=graphical.target

 

3. サービスの有効化と起動

ファイルを作成したら、以下の手順でシステムに認識させ、起動します。

1.設定の反映

sudo systemctl daemon-reload

2.サービスの有効化(次回起動時から自動実行)

sudo systemctl enable TFlite.service
    ```
3.  **今すぐ起動**
    ```bash
    sudo systemctl start TFlite.service
    ```
4.  **ステータス確認**
    ```bash
    sudo systemctl status TFlite.service
    ```
    ここで `Active: active (running)` となっていれば成功です。

---

## 重要な注意点

### 1. GUI(ウィンドウ)の表示について
もしこのPythonスクリプトが OpenCV の `cv2.imshow()` などで**画面に映像を表示する**タイプの場合、systemd(バックグラウンド)から実行すると「画面が見つからない」というエラーで落ちることがあります。
その場合は、上記のサービスファイル内の `Environment=DISPLAY=:0` のコメントアウトを外すか、GUI環境が必要ない(Headless)ようにコードを修正してください。

### 2. ログの確認方法
`.desktop` 起動の時はターミナル(lxterminal)で見えていた出力は、今後は以下のコマンドで確認できます。
```bash
journalctl -u TFlite.service -f

 

現在の .desktop ファイルでの自動起動(/home/pi/.config/autostart/windowpi.desktop)は、不要になったので削除しても大丈夫ですか?

はい、削除(または無効化)することを強くおすすめします。

理由はシンプルで、現在の設定のままだと「1つのアプリを2重に起動しようとしてしまう」からです。

 

 

なぜ lxterminal を使いたいのですか?

もし目的が「プログラムが動いている様子(print文など)をリアルタイムで見たい」ということであれば、前回の回答で紹介した journalctl -u TFlite.service -f コマンドが標準的なプロの方法です。

しかし、「現場でディスプレイだけ繋いで、マウスもキーボードもない状態でパッと画面が出てほしい」という用途であれば、今回の lxterminal を通す方法は非常に視認性が良くて便利だと思います。

 

 

「パッと画面を出す」ための必須条件

① 自動ログインの設定

② スリープ(スクリーンセーバー)の無効化

 

最後に

なぜ .desktop より systemd がいいのか

今回の「現場運用」において、systemd に切り替えるメリットは以下の通りです。

  • ゾンビ化防止: .desktop は一度落ちたらそれっきりですが、systemdRestart=always のおかげで、Pythonがセグメンテーションフォルトなどで異常終了しても、勝手にターミナルを立ち上げ直してくれます。

  • 起動順序の制御: After=graphical.target と書くことで、「まだデスクトップの準備ができていないのにアプリを起動しようとしてエラーになる」という事故を防げます。

 

本記事をお読みいただき、ありがとうございます。

以上となります(`・ω・´)v