Mana Blog Next

仕事と家庭、自宅IoTへのチャレンジを綴るブログ

cronの代替手段 timerでラズパイZeroのカメラを定点観測しよう

f:id:mana-cat:20170503011149j:plain

(ラズパイZeroのカメラによって定点観測された写真)

timerを使ってみよう

今回は、cronの代わりに systemdのユニットの一つである timer を使ってラズパイZeroのカメラを撮影し、NASに保管する処理をやってみましょう。

前回のエントリーはこちら。

systemdのtimerユニットについて

おさらいすると、Raspbian Jessieからsystemdを採用するようになりました。systemdではサービスの起動や停止処理などの管理対象をユニットという概念で定義し、timerもこの流れでユニットとして定義されました。

cronからtimerに置き換わると、数年後にはcronを知らない世代が出てくると思います。新人教育にも「昔、cronっていうのがあってのぅ・・・」と懐かしむ未来が予測されます。Raspbianではまだcronが使えるものの、今後のことを考えるとtimerも知っておいた方が良いでしょう。

systemctlコマンドで timer リストを表示してみると、デフォルトで有効になっているtmpファイルのお掃除ジョブがスケジュールされているのが分かりますね。

$ systemctl --system list-timers
NEXT                         LEFT     LAST                         PASSED       UNIT                         ACTIVATES
水 2017-05-03 20:08:50 JST  22h left 火 2017-05-02 20:08:50 JST  1h 32min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

準備するファイル

今回は以下のファイルを準備し、timerを設定します。 .service ファイルでユニットにどのような処理をするのか、どのターゲットで動作するのかを定義(撮影コマンドを実行)し、.timer ファイルで処理時間(撮影する間隔)を定義します。

  • スクリプトファイル /usr/local/bin/picamera
  • serviceファイル /etc/systemd/system/picamera.service
  • timerファイル/etc/systemd/system/picamera.timer

スクリプトを作成する

まずは、撮影をするためのスクリプトを作成します。以下のようにファイルを作成します。写真は5分毎に撮影するので、ファイル名は重複しないように一意である必要があります。今回はファイル名を単純に yyyymmddHHMM.jpg にしてNASに保存しています。

$ sudo nano /usr/local/bin/picamera
#!/bin/sh
raspistill  -w 1920 -h 1080 -o /mnt/nas/picamera/`date +%Y%m%d%H%M`.jpg

次に、作成したスクリプトファイルのパーミッションを変更し、実行権限を付けます。

$ sudo chmod 755 /usr/local/bin/picamera

サービスファイルを作成する

サービスファイルを作成して、ExecStart に実行するスクリプトを指定します。どのターゲットで動作するのかは、 WantedBy=multi-user.target のように指定します。multi-user.target は、かつてのランレベル3相当で動作することを意味します。

$ sudo nano /etc/systemd/system/picamera.service
[Unit]
Description= Shooting script

[Service]
Type=simple
ExecStart=/usr/local/bin/picamera

[Install]
WantedBy=multi-user.target

systemctlでpicamera有効化します。省略せずに sudo systemctl enable picamera.service でも動きます。

$ sudo systemctl enable picamera
Created symlink from /etc/systemd/system/multi-user.target.wants/picamera.service to /etc/systemd/system/picamera.service.

timerを設定する

次は、有効にしたスクリプトに対して、実行する時間を .timer ファイルで定義します。OnBootSec=1min でOSのブートが終わってから1分後に timer が有効化され OnUnitActiveSec=5min で5分ごとにタイマーをセット、そしてペアになる .service ユニットは picamera.service であることを定義しています。

$sudo  nano /etc/systemd/system/picamera.timer

[Unit]
Description= Shot every 5 minutes

[Timer]
OnBootSec=1min
OnUnitActiveSec=5min
Unit=picamera.service

[Install]
WantedBy=multi-user.target

timer ファイルを保存したら、systemctlコマンドで picamera.timer を起動後、OS起動時に picamera.timer が起動されるように設定を有効化します。

$ sudo systemctl start picamera.timer
$ sudo systemctl enable picamera.timer
Created symlink from /etc/systemd/system/multi-user.target.wants/picamera.timer to /etc/systemd/system/picamera.timer.

timer を確認する

timer が有効になっているかtimer リストで確認してみます。

$ systemctl --system list-timers
NEXT                         LEFT         LAST                         PASSED       UNIT                         ACTIVATES
火 2017-05-02 22:33:41 JST  4min 6s left 火 2017-05-02 22:28:41 JST  53s ago      picamera.timer               picamera.service
水 2017-05-03 20:08:50 JST  21h left     火 2017-05-02 20:08:50 JST  2h 20min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

NASに保管されたかどうか、撮影された写真を確認してみましょう

$ ls -l /mnt/nas/picamera
合計 20350
-rwxrwxrwx 1 pi pi  578738  52 22:28 201705022228.jpg
-rwxrwxrwx 1 pi pi  174491  52 22:33 201705022233.jpg
-rwxrwxrwx 1 pi pi  482100  52 22:38 201705022238.jpg
-rwxrwxrwx 1 pi pi  123716  52 22:43 201705022243.jpg
-rwxrwxrwx 1 pi pi  274459  52 22:48 201705022248.jpg
-rwxrwxrwx 1 pi pi  295935  52 22:53 201705022253.jpg
-rwxrwxrwx 1 pi pi  316222  52 22:58 201705022258.jpg
-rwxrwxrwx 1 pi pi  140561  52 23:03 201705022303.jpg
-rwxrwxrwx 1 pi pi 1068712  52 23:08 201705022308.jpg
-rwxrwxrwx 1 pi pi 1075426  52 23:13 201705022313.jpg
-rwxrwxrwx 1 pi pi 1037991  52 23:18 201705022318.jpg
-rwxrwxrwx 1 pi pi 1080466  52 23:23 201705022323.jpg

もちろん、NASに繋いでいるWindowsからでも確認できます。

f:id:mana-cat:20170503005902p:plain

センサー+カメラの組み合わせ

センサーとカメラを組み合わせて定点観測するとより効果的です。ラズパイZeroのセンサーについては以下を参照

timer を停止・無効化したいとき

今回作成した timer を停止したいときは、以下を実行します。picamera.timer および picamera.service どちらも停止、OS起動時にデフォルトで起動しないようにします。

$ sudo systemctl stop picamera.timer
$ sudo systemctl stop picamera.service
$ sudo systemctl disable picamera.service
Removed symlink /etc/systemd/system/multi-user.target.wants/picamera.service.
$ sudo systemctl disable picamera.timer
Removed symlink /etc/systemd/system/multi-user.target.wants/picamera.timer.

次回はクラウドサービスとの連携について書きます。

改訂3版 Linuxエンジニア養成読本 (Software Design plus)

改訂3版 Linuxエンジニア養成読本 (Software Design plus)

© Manami Taira