Raspberry PI2で定期的にHubotを起こす

うちのHubotは30分間アクセスがないと寝てしまうので、常時起動しているRaspberry PI2から20分に1回アクセスして寝かせないようにした。
要は、UNIX(Linux)のcrontabを初めて書いてみた、という話です。

家庭内Slackはじめました

エンジニア界隈では「いまどきメールでの情報共有は無いわー」とされていて、Slackなどのチャットサービスで情報共有し、ついでにプロダクトの自動デプロイまでやっちゃうらしい。

僕もそんなチャットサービスを使ってみたいんだけど、職場ではSlackのような社外サービスを使うことが禁止されている。

そこで、LINEすら使っていないうちの家庭内の情報共有ツールとして、Slackを導入してみた。結果は上々。

Slackによる家庭内情報共有

急にスマホにSlackアプリをインストールさせられ、アカウントを作ることになった家族は、迷惑な思いをしたに違いない。
最初は「何それ使えんの?」と半信半疑だったけど、一週間と経たないうちに「じゃあ、○○はSlackに貼っておくからね」とごく普通に使い始めた。
「Slackに書いたり貼ったりしておけば、家族に見てもらえる。そして記録に残る」という嬉しさは、家庭内Slackでも十分に享受できる。

  • 旅行の準備
  • 旅行中の状況報告
  • 買ってきてほしいものメモ
  • その他雑談

など、いろんな用途に使える。

どうせならHubotも

Slackによる情報共有の便利さは体感できた。

次は、「Slackからプロダクトをデプロイ」とかカッコいいこともしてみたい!

という訳で、bouzuyaさんのQiita連載を参考に、HubotをHerokuで動かし、Slackと連携させるところまで作業した。

Slackによる家庭内情報共有

Hubot導入の手順については、上記のbouzuyaさんの懇切丁寧な説明をなぞっただけなので、ここではパス!(bouzuyaさん、本当にありがとうございます。)

家族も、

@hubot: img NMB48

とか打ち込んで、楽しむようになった。

しかし、Hubotは寝る。

正確には、Herokuで無料で動かすWebアプリには、制約がある。

  1. 30分間アクセスがないと、寝る。
  2. 無料で動かすアプリは、一日に6時間はまとめて寝る必要がある。(1日中起こしっぱなしにはできない)

「趣味で使う範囲ならココまでね」という制約としては、十分受け入れられる、見事な条件設定。

しかし、寝てしまったHubotをいちいち起こすのは面倒。なので、うちで24時間稼働しているマシンのうち、Gmailのメールフィルタリングに使っているRaspberry PI2を「Hubot起こし係」に仕立てることにした。

(なお、Raspberry PI2にUbuntuをインストールして、メールフィルタリング・ソフトを動かすまでの道のりについては、こちらからどうぞ。→ Raspberry PIで遊ぶ

cronを設定する

さて、ここからがようやく本題。

使ったことないけど、UNIXには「cron」という仕組みがあり、それを使えば指定したタイミングで指定したプログラムを実行できる、ということは知っていた。

あとはそれを勉強して、実際に書いてみるだけだ!という訳で、この解説記事↓を参考にした。

Hubotを起こすスクリプトを書く

まずは、Heroku上のHubotアプリにアクセスするだけのシェルスクリプト~/crons/hubot-wake-upを書いた。

#!/bin/sh

/usr/bin/curl https://[Hubot用サブドメイン].herokuapp.com

chmodで実行権限を有効にして、このスクリプトを動かしてみる。

ubuntu@raspi2:~$ ./crons/hubot-wake-up
Cannot GET /

うん、とりあえずはHerokuのHubotサービスに繫がったっぽい。

定期的にスクリプトを実行するcronを設定

次に、作ったばかりのシェルスクリプトを定期的に呼び出すcron設定(crontab)を記述する。

具体的には、crontab -eコマンドで、そのユーザ用のcrontabファイルの編集画面が開く。
初期状態ではコメント文しかないので、上記スクリプトを呼び出すスケジュール設定を書く。

# Edit this file to introduce tasks to be run by cron.
#
# 〜最初から埋まっていたコメント文は中略!
#
# For more information see the manual pages of crontab(5) and cron(8)
#

MAILTO=""

# m h  dom mon dow   command
10,30,50 0,7-23 * * * /home/ubuntu/crons/hubot-wake-up

この設定のポイントは、次の通り。

  • どうもcronはメッセージをメールで飛ばそうとするらしい。そして、メールを送信できる環境を整えておかないと、いちいち/var/log/syslog
(CRON) info (No MTA installed, discarding output)

という情報が出力される。害はないかもしれないけれど、ときどきチェックしたいログの量が無用に増えるのもイヤなので、

MAILTO=""

と設定した。これにより、上記の「MTAうんぬん」情報はログに出なくなった。

  • Hubotに、毎時10分,30分,50分の3回アクセスしてやることで、「30分アクセスがないとHubotが寝る」事態を回避する。
    そのため、「分」フィールドは10,30,50と設定した。
  • ただし、Heroku上で無料で動かすアプリが守るべきルールとして、「1日6時間は連続して寝ること」という条件を守らねば! なので、「時」フィールドは0,7-23と設定した。
    これにより、「0時台と、7〜23時台にのみ実行」と指定したことになる。

おわりに

初めてcron(crontab)を設定してみたけど、/var/log/syslogで確認してみる限り、ちゃんと指定したスケジュールでスクリプトが実行されている。

おかげで、家族が起きている時間帯は、いつ呼びかけてもHubotがすぐに返事を返してくれる。

いつもすぐに返事してくれるHubot

これで、うちのRaspberry PI2の任務は2つに増えた。

  1. 30秒ごとにGmailの「受信箱」に入っているメールを分類する(←POPFile)
  2. 家族が起きている時間帯は、Hubotを寝かさないようにする(←シェルスクリプト+crontab)

5,000円のマシンですが、いい仕事してます!\(^o^)/

Comments