(ラズパイ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 5月 2 22:28 201705022228.jpg -rwxrwxrwx 1 pi pi 174491 5月 2 22:33 201705022233.jpg -rwxrwxrwx 1 pi pi 482100 5月 2 22:38 201705022238.jpg -rwxrwxrwx 1 pi pi 123716 5月 2 22:43 201705022243.jpg -rwxrwxrwx 1 pi pi 274459 5月 2 22:48 201705022248.jpg -rwxrwxrwx 1 pi pi 295935 5月 2 22:53 201705022253.jpg -rwxrwxrwx 1 pi pi 316222 5月 2 22:58 201705022258.jpg -rwxrwxrwx 1 pi pi 140561 5月 2 23:03 201705022303.jpg -rwxrwxrwx 1 pi pi 1068712 5月 2 23:08 201705022308.jpg -rwxrwxrwx 1 pi pi 1075426 5月 2 23:13 201705022313.jpg -rwxrwxrwx 1 pi pi 1037991 5月 2 23:18 201705022318.jpg -rwxrwxrwx 1 pi pi 1080466 5月 2 23:23 201705022323.jpg
もちろん、NASに繋いでいるWindowsからでも確認できます。
センサー+カメラの組み合わせ
センサーとカメラを組み合わせて定点観測するとより効果的です。ラズパイ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)
- 発売日: 2016/08/23
- メディア: 大型本