clockwork は、cron の代替となる機能を単独で提供してくれる軽量のツール/ライブラリです。
clockwork を使えば Heroku で定期実行処理ができます。
必要なソースコードは最小限です。
この単純な定期実行アプリケーションの動きがわかれば、 より高度な定期実行アプリケーションを動かす足掛かりになります。
実行するアプリケーションが1つだけであれば*1無料で試せます。
お知らせ(2013/01/24)
サンプルが以下のエラーにより動かなくなっていることに気づき修正しました。
`require': no such file to load -- ./clock.rb
動かなくなった正確な時期はわかりませんが、Procfile の改行コードを LF にしなければいけないようになったようです。
もしも上記問題で動かなくて困っている人は、Procfile の改行コードを LF にして再度試してみてください。
サンプルファイルのダウンロード
以下のファイルをダウンロードし、解凍してみてください。
入っているのは以下の3つのファイルだけです。
前提
- 「Heroku quickstart」の 1 ~ 3 を参考に、サインアップ/ツールインストール/ログインできること。
- 「clockwork について」を参考に clockwork をインストールしていること。
定期実行アプリケーションのインストールと起動と確認
定期実行アプリケーションを Heroku にインストールし、起動し、確認をするまでの一連の流れについて説明します。
以下に説明するコマンドは helloclockwork.zip を解凍したディレクトリで全て行なってください。詳細な解説は次の節で行います。
利用するライブラリのダウンロード
bundle install
Git への登録
git init git add . git commit -m "init"
Heroku にアプリケーション環境を作成
heroku create
Heroku への定期実行アプリケーションのインストール
git push heroku master
アプリケーションの起動
heroku scale cron=1
アプリケーションの確認
heroku logs --tail
解説
利用するライブラリのダウンロード
bundle コマンドは Bundler というライブラリ(gem)管理用のツールです。
Gemfile に記載のあるライブラリをダウンロードしてくれます。また、その結果を Gemfile.lock というファイルに書きこんでくれます。
Heroku は、この Gemfile と Gemfile.lock を見て利用するライブラリをアプリケーション環境にインストールします。
Git への登録
Git とはバージョン管理システムの一種です。
他のバージョン管理システムとの大きな違いは、その作業ディレクトリ自体がリポジトリになる点です。
git init は作業ディレクトリをリポジトリにするコマンドです。
git add . でディレクトリにある全てのファイルをリポジトリ登録対象とし、git commit でファイルすべてをリポジトリに登録を実行します。
リポジトリの標準の名前には master という名前が付けられます。
コマンドを実行した後、作業フォルダに .git というフォルダが作成されていると思います。これがリポジトリの情報です。
Heroku にアプリケーション環境を作成
heroku create コマンドは Heroku 上にアプリケーション環境*2を作成するコマンドです。
作成したアプリケーション環境は、Web の管理画面*3で確認できます。
最初は適当な名前が付きますが、名前は後で変更できます。
このコマンドを実行した時点で .git/config ファイルに以下のような記述が追加されます。
[remote "heroku"] url = git@heroku.com:xxxx-xxxx-xxxx.git fetch = +refs/heads/*:refs/remotes/heroku/*
アプリケーション環境の名前を変更した場合は、xxxx-xxxx-xxxx の部分も合わせて変更して下さい。
Heroku への定期実行アプリケーションのインストール
git push heroku master の heroku とは .git/config ファイルにある heroku のことでデプロイ先の Heroku リポジトリのことを指します。
master とは作業ディレクトリのリポジトリに付けられた名前のことです。
git push heroku master とは、master の内容を heroku に入れるというコマンドで、すなわちアプリケーションのデプロイという意味になります。
デプロイ時にメッセージが流れます。以下のメッセージを探して下さい。
-----> Discovering process types Procfile declares types -> cron
これが定期実行アプリケーションの起動を表します。
Procfile とは foreman というアプリケーション起動環境用の設定ファイルです。
Heroku は Procfile を見つけると foreman を起動します。
Procfile には以下のように記述されています。
cron: bundle exec clockwork clock.rb
bundle exec とは Bundler がインストールしたライブラリ(gem)環境を使ってコマンドを起動するコマンドです。
clockwork は定期実行アプリケーションを起動するコマンドです。
foreman は、Heroku*4 の基本要素の1つです。
アプリケーションの起動
Heroku にアプリケーションはインストールしましたが、 この時点ではアプリケーションは起動していません。
heroku ps
を実行してみてください。
このコマンドは、アプリケーション環境で動作しているプロセスの一覧を出力するものですが、何も表示されないはずです。
Heroku は、標準で Procfile の定義にある web という名前のアプリケーションにしかプロセスを割り当てません。
以下のコマンドは、Procfile の定義にある cron という名前のアプリケーションにプロセスを 1 つ割り当てます。
heroku scale cron=1
0 を指定すれば停止し、2 以上の値を指定すれば複数のプロセスが並行して動きます。
heroku scale コマンドを実行したあとに heroku ps を実行すると、以下のように表示されるはずです。
=== cron: `bundle exec clockwork clock.rb` cron.1: up for 18s
複数のプロセスを起動した場合、それぞれのプロセスの合計稼働時間が全体の稼働時間とみなされます。 Web アプリケーションも起動していれば、それも合計します。その合計時間が 750 時間以上 > 744 時間(1 プロセス × 31 日 × 24 時間)にならなければ無料です。
clockwork 内で複数の定期実行処理を定義してもプロセスは 1 つです。
アプリケーションの確認
Web アプリケーションと違って、定期実行処理の結果はブラウザを通して見ることはできません。
以下のコマンドは Heroku で動作している foreman の標準出力を見るコマンドです。
heroku logs --tail
10 秒毎に以下のようなメッセージが流れるのが見えると思います。
xx:xx:xx cron.1 | Triggering frequent.job xx:xx:xx cron.1 | Running frequent.job
clock.rb がこれを出力しています。
コマンドを止めるには SIGINT シグナルを送信してください。Windows の場合は Ctrl + C で止まります。
アプリケーションの削除
Web の管理画面で対象のアプリケーションを選んで、おもむろに Destroy App してください。
ローカルの作業フォルダは単に削除すればそれだけで大丈夫です。
試行錯誤で勉強
ここまでできたら色々と試行錯誤をして、動作がどのように変わるか試すことが簡単にできるようになります。
どんどん試行錯誤して勉強しましょう。
ローカル環境で試行錯誤
foreman/clockwork は自分の環境でも動作します。
以下のページを参照してローカル環境で確認する方法も覚えれば試行錯誤が早くできるようになります。
ローカル環境での変更を Heroku への反映
何かを変更したら以下のようなコマンドを実行して下さい。Gemfile を変更した場合だけ特殊です。
- Gemfile を変更し、ライブラリを追加した場合
bundle install git add . git commit -m "変更内容の説明" git push heroku master
- その他のファイルを変更した場合
git add . git commit -m "変更内容の説明" git push heroku master
関連
コメント
本ページの内容に関して何かコメントがある方は、以下に記入してください。
コメントはありません。 コメント/heroku/helloclockwork