Matthewの備忘録

忘れたときはここを見ろ。何か書いてある。

昆布乾燥室温湿度モニタリングシステム その5

 推奨されていたので、「はてなダイアリー」からこの「はてなブログ」に引っ越した。本当は、記事を書きためておけるから、こうしたのである。

cron

 Raspberry Piの設置作業の度に端末からgoogle_spreadsheet.pyを実行していたのでは手間である。そこで、cronから周期的にgoogle_spreadsheet.pyを実行することにした。google_spreadsheet.py自体に周期センサー読み取り機能があるので、その機能を取り除いた。

google_spreadsheet.pyの改造

 本来なら、周期実行も一度きりの実行もどちらも対応可能なスクリプトを書きたいが、1行書き加えるだけで済むので、作業時間を考え、そうした。
google_spreadsheet.pyに次の一行を加える:

    ...
    # Append the data in the spreadsheet, including a timestamp
    try:
        worksheet.append_row((datetime.datetime.now(), temp, humidity, cpu_temp))
        # cyclic running is delegated to cron(added by Matthew) これはコメント
        break # 加えた行がコレ
    except:
        # Error appending data, most likely because credentials are stale.
        # Null out the worksheet so a login is performed at the top of the loop.
        print('Append error, logging in again')
        worksheet = None
        time.sleep(FREQUENCY_SECONDS)
        continue
    ...
crontab

 パッケージがインストールされているはずだし、おそらくデフォルトでcronのデーモンが動いているはずであるが、確認をしておこう。

pi@raspberrypi:examples $ service cron status
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled)
   Active: active (running) since 月 2016-MM-YY hh:mm:ss JST; 5 days ago
     Docs: man:cron(8)
 Main PID: 416 (cron)
   CGroup: /system.slice/cron.service
           └─416 /usr/sbin/cron -f
pi@raspberrypi:examples $ chkconfig -l | grep cron
cron                      0:off  1:off  2:on   3:on   4:on   5:on   6:off
pi@raspberrypi:examples $ 

動いてなかったり、そもそもインストールされていなかったら、インストールしたり、デーモンを起動させるべし。
 cronデーモンの起動を確認したら、google_spreadsheet.pyを周期実行をさせるためにcrontabを立ち上げる。必ずrootユーザーで登録すべし。調べてはいないが、root権限で実行しなければならないものがあったばあいに動かないかもしれないからである。

$ sudo crontab -e

立ち上げるとnanoエディターでcronの設定を記述しないといけない(恐らく他のエディタが立ち上がるように変更は可能だが、ここでは扱わない)。次のように書いておけば、5分おきに実行される。

*/5 * * * * sudo /usr/bin/python /usr/local/bin/google_spreadsheet.py

詳しいことはcrontabについて詳細な解説をしているページに譲る。/usr/bin/pythonはなくても実行されるだろう。次のコマンドで設定内容を確認できる。rootユーザーで設定したので、sudoを忘れずに。

$ sudo crontab -l

追記

 google_spreadsheet.pyに限らず、cronで実行したはのは良いが、何等かのエラーが出て、さらにrootにメールが送られていることがある。最悪は今回の場合スプレッドシートに何も記録されていないことである。参考先に書いてある通りに、postfixを設定し、エラーメールが飛ぶようにして、原因究明を図り、専用のエラーログを吐かせて、それをローテイトさせることまでやりたいのだが、とりあえず、標準出力とエラーは/dev/nullに捨ててやり過ごすことにした。標準出力と標準エラー出力どちらも/dev/nullに捨ててしまうことにした。こうすることで、とりあえずrootにメールが沢山貯まることはなく、そしてまともにスプレッドシートに記録されていくこともある(根本解決ではない)。

*/10 * * * * sudo /usr/bin/python /usr/local/bin/google_spreadsheet.py > /dev/null 2>&1

参考:
dqn.sakusakutto.jp