Raspberry PiでVirtualenv環境のPythonスクリプトを自動起動するには (LINE編)

workon <仮想環境名>コマンドで virtualenv 環境の切り替えが必要な Python スクリプトを、Raspberry Pi 起動時に自動起動したいときには、Linuxオペレーティングシステムの systemd と呼ばれる機能を使います。

設定ファイルの作成

初めに、.serviceという拡張子の付いた設定ファイルを作成します。

Raspberry Piのnano エディタや Text Editor を使用して、次の内容を含むサービス設定ファイルを作成します。ファイル名は自動起動するスクリプトを表す名前(例:ailine.service)にし、ホームディレクトリに保存しておきます。

[Unit]
Description=AILINE
After=syslog.target network.target

[Service]
Environment=DISPLAY=:0.0
Environment=XAUTHORITY=/home/pi/.Xauthority
ExecStart=/home/pi/.virtualenvs/cv4/bin/python /home/pi/ai101/image.py -p /home/pi/ai101/config.pbtxt -w /home/pi/ai101/frozen_inference_graph.pb -t 17
Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3
Type=simple
User=pi
Group=pi

[Install]
WantedBy=multi-user.target

設定ファイルの詳細には触れませんが、ExecStart= の後に指定しているのが、起動したいプログラムです。この例では、cv4 という名前のついた仮想環境で、ai101 フォルダ内の Python スクリプト、image.py を起動するように設定しています。

この例のように、image.py といった起動したいスクリプトファイル名や、オプションで指定する config.pbtxt といったファイル名はすべて、「フルパス」で指定する必要があります。他は手動でスクリプトを起動するのと同じです。

Description は AILINE としていますが、こちらも起動するスクリプトを表す名前にしておけば良いでしょう。

systemdへの適用

作成した設定ファイルをシステムに適用します。設定ファイル名をailine.service としホームディレクトリに保存済として解説します。

ターミナルで、Linuxのcp (コピー)コマンドを使用して、ailine.service ファイルを systemd の設定ファイルを保存しておくフォルダ「/etc/systemd/system」へコピーします。コピー後、「sudo systemctl daemon-reload」でファイル更新をシステムへ知らせます。

$ sudo cp ailine.service /etc/systemd/system
$ sudo systemctl daemon-reload

設定を有効にします。下記コマンド例のaimailの部分は設定ファイル名です。この有効にする操作は一度しておけば良いです。aimail.serviceファイルの修正の都度実行する必要はありません。

$ sudo systemctl enable ailine

動作確認のために手動で起動してみます。

$ sudo systemctl start ailine

sudo systemctl statusコマンドで、状態を確認します。

$ sudo systemctl status ailine

「Active」が「active (running)」となって入れば起動成功です。

「X」をクリックしてターミナルを閉じましょう。

一度この状態にしておけば、Raspberry Pi起動時に自動的にスクリプトが起動されます。明示的にプログラムを終了させたいときには「sudo systemctl stop ailine」で停止できます。

トラブルシューティング

active (running)とならないときには「sudo systemctl stop ailine」で一度明示的にプログラムを停止させ、設定ファイルやPythonコマンド等を見直してみましょう。設定ファイルを修正したときには、設定ファイルの「/etc/systemd/system」へのコピーと「sudo systemctl daemon-reload」を忘れないようにしてください。

トラブルシューティング時に「cat /var/log/syslog|grep python」コマンドでログを確認することで、問題点を見つけるのに役立つ場合があります。

$ cat /var/log/syslog|grep python