RaspberryPi 3 Model B+でIoT監視カメラをつくる(その4プログラムの自動起動設定)
Contents
RaspberryPi(ラズパイ)でIoT監視カメラ
RaspberryPi 3 Model B+とカメラ(Raspberry Pi Camera Module V2)とモーションセンサー(HC-SR501)で動きがあった時だけ録画する監視カメラを作成したときの備忘録の4回目。
1回目はRaspberryPiとカメラ、モーションセンサーとの接続に関するこちらの記事を参照。
2回目はGoogleDriveにアクセスする為のGoogle Developersの設定とLINEにメッセージを送信するためのLINE Notifyでのアクセストークンの発行に関する記事。
3回目はPythonのプログラムの説明の記事。
今回はRaspberryPiのプログラムの起動環境、CLI起動とプログラムの自動起動に関する記事とする。
CLI起動に変更する
監視カメラプログラムを長時間動作させるにあたってGUI(デスクトップ)環境である必要はない。
今までは操作性上、デスクトップ環境で開発・テストを行ってきたが継続稼働させるのであればCLI(Command Line Interface)の方がリソースも消費しないので好ましい。
RaspberryPiのメニューから”RaspberryPiの設定”の”システム”タブでブートをCLIに変更する。
VNCの無効化
またVNC接続も不要なので無効にしておく。
セキュリティ上はSSHも無効にした方が好ましいが、そうすると何らかの変更やrebootをしたい時にRaspberryPiにキーボードとディスプレイを接続しないと操作ができない。
それは流石に面倒なのでSSHは有効にしておいた。
raspi-config
上記はGUI環境からの操作だがCLI起動になった後ではterminalからでも同様の設定変更や元に戻すことができる。
sudo raspi-config
上記のコマンドを入力するとRaspberryPiの設定画面が表示されるので、
”3 Boot Options”を選択する。
”B1 Desktop/CLI”を選択する。
”B1 Console”(自動ログインをしない)を選択する。
最初の画面に戻るので”Finish”を選択する。
再起動をするかを聞かれるので”はい”を選択する。
CLI起動の自動ログイン無しに設定される。
監視カメラプログラムの自動起動
自動起動のやり方
電源を入れた時に自動的に今回作成した”SecCamera.py”を起動するようにしたい。
プログラムの自動起動には幾つかの方法がある。
- systemdを使用する方法
- /etc/rc.localに起動スクリプトを記述する方法
- etc/lxsession/LXDE-pi/にautostartファイルを記述する方法
以前にTKinter(Python からGUIプログラムを構築するためのライブラリ)を使ったプログラムを自動起動させようとした時には3.の方法を使った。
なぜなら1、2ではGUI環境が整ってからのプログラムの起動がうまく制御できなかったので。
systemdにてWantedBy=graphical.targetを指定したのだけれども上手く起動できる時と駄目な時があった。
しかし今回はGUI環境では無いので1.のsystemdを使うことにした。
以前は2.が主流だったようだが今のOSではsystemdを使う方法が推奨されている模様。
systemdの設定
/etc/systemd/system/配下にsecurity-camera.serviceファイルを作成する。
※security-cameraの部分は任意の文字列
sudo vi /etc/systemd/system/security-camera.service
[Unit]
Description = Security Camera
After=network.target
[Service]
ExecStart=/usr/bin/python /opt/security-camera/SecCamera.py
Restart=always
Type=simple
[Install]
WantedBy=multi-user.target
設定可能なパラメータの詳細については別記事にしようと思う。
今回は監視カメラで設定したパラメータを中心に説明する。
Description | 説明文 |
2019/09/16 追記 After | ここで指定したユニットの後に起動される(事前に起動しているべきユニットを指定する) ネットワークが起動した後にプロセスを起動させたかったのでnetwork.targetを指定した |
ExecStart | 起動したいプロセスを記述する Pythonを起動してプログラムをパラメータで渡している |
Restart | プロセスが終了した時の再起動の指定 ”always”:常に再起動するを指定した 監視カメラプログラムが何らかの理由で終了してしまった時も自動で再起動して欲しいのでalwaysを指定した ちなみに”no”だと再起動しない |
Type | simpleを指定した simpleはプロセスをフォアグラウンドで起動した場合の指定、バックグラウンドで起動した場合はforkingを指定する |
WantedBy | multi-user.targetを指定した この辺りも詳細は別記事とする |
登録状態の確認
ファイルを保存したら以下のコマンドで登録状態を確認する。
systemctl list-unit-files --type=service
一覧にdisableで表示されていればOK。
有効化
以下のコマンドで自動起動を有効化する。
sudo systemctl enable security-camera.service
もう一度先程のコマンドでステータスを確認してenableになっていればOK。
その他のコマンド
上記の他に使用可能なコマンド
サービスの自動起動の停止
sudo systemctl disable security-camera.service
サービスの開始
sudo systemctl start security-camera.service
サービスの停止
sudo systemctl stop security-camera.service
ステータスの確認
sudo systemctl status security-camera.service
デーモンのリロード
sudo systemctl daemon-reload
エラーの場合
尚、何らかのエラーで自動起動が有効にならない時のエラーログは以下のファイルを確認してみる。
- /var/log/syslog
- /var/log/message
「権限が無い」「スペルを間違えた」等の理由が多い気がする。
次回の記事
今回の記事は以上で終了。
次回は外観(外箱)を作成した時の記事とする。
次回の記事はこちら。
動画
この記事の内容を動画にしているので参考にして欲しい。
最近のコメント