前回より cron っぽくするべく、今度は Ruby でやってみる。
基本的には公式のドキュメントに解説があるのだけど、
私のような Ruby 素人にはよくワカランし忘れそうなので備忘録。
実行コード
今回も「5分おきに特定のURLにアクセス」にチャレンジ。
実行スクリプト名 [app.rb]
require 'rubygems' require 'rufus/scheduler' require 'net/http' scheduler = Rufus::Scheduler.new scheduler.every '5m' do Net::HTTP.get('HOGE.com', '/hoge.php') end scheduler.join
Ruby の入門サイトあたりを見ればなんとなく理解できる。
たぶん、必要なライブラリを読み込んで、
require 'rubygems' require 'rufus/scheduler' require 'net/http'
スケジューラーのオブジェクトを作成して、
scheduler = Rufus::Scheduler.new
スケジュールを設定して、
scheduler.every '5m' do Net::HTTP.get('HOGE.com', '/hoge.php') end
開始。
scheduler.join
てな感じかな?
cron っぽく書くことも可能。
scheduler.cron '*/5 * * * *' do
さらにはタイムゾーンも指定できるそうな。(たぶん)
scheduler.cron '15 6 1 * * Asia/Tokyo' do
(例:日本時間で毎月1日6時15分に実行)
依存関係
実行ファイルはできたものの、これをデプロイしただけでは動かない。
パッケージ管理(RubyGems)を使っているので依存関係を何とかせにゃならんらしい。
全然詳しくない分野なので、やったコトだけさらっと書いておこうw
まず、上の app.rb と同じディレクトリに Gemfile という名前のファイルを作る。(拡張子なし)
内容はテキストで次の通り。
[Gemfile]
source "http://rubygems.org" gem "rufus-scheduler"
次に Ruby を使える環境(Windows の場合は [Ruby コマンドプロンプトを開く])から RubyGems 管理用のツール(?) Bundler をインストール。
gem install bundler
つづいて Gemfile があるディレクトリで
bundle install
とコマンドを打つ。
すると rufus-schedler と依存関係にある tzinfo がインストールされ、同時に Gemfile.lock というファイルが作成される。
[Gemfile.lock]
GEM remote: http://rubygems.org/ specs: rufus-scheduler (3.0.8) tzinfo thread_safe (0.3.4) tzinfo (1.2.1) thread_safe (~> 0.1) PLATFORMS x86-mingw32 DEPENDENCIES rufus-scheduler
ちなみに AppFog のサーバーは ubuntu っぽいので、
PLATFORMS ruby
とかにした方がいいのかもしれない。どっちでも動いたけどw
で、結局デプロイすべきファイルは次の3つです。
- app.rb
- Gemfile
- Gemfile.lock
app 作成&デプロイ
あとは AppFog のアプリを作成して実際にデプロイするだけ。
app の名称を「cron_test_02」としてやってみる。
af push cron_test_02
対話形式で進む。
Would you like to deploy from the current directory? [Yn]: Detected a Standalone Application, is this correct? [Yn]: 1: clr20 2: clr40 3: java 4: node04 5: node06 6: node08 7: node10 8: php 9: python2 10: ruby18 11: ruby192 12: ruby193 Select Runtime [ruby18]: 12 Selected ruby193 Start Command: ruby app.rb 1: CLC - Santa Clara 2: AWS US East - Virginia 3: AWS EU West - Ireland 4: AWS Asia SE - Singapore Select Infrastructure: 4 Application Deployed URL [None]: Memory reservation (128M, 256M, 512M, 1G, 2G) [128M]: How many instances? [1]: Create services to bind to 'cron_test_02'? [yN]: Would you like to save this configuration? [yN]: Creating Application: OK Uploading Application: Checking for available resources: OK Packing application: OK Uploading (1K): OK Push Status: OK Staging Application 'cron_test_02': OK Starting Application 'cron_test_02': OK
色つきの部分がデフォルト以外を設定した箇所で、内容は PHP の時と大体同じ。
何故かスタンドアロンにしてくれるのでそのままデフォルトでw
Detected a Standalone Application, is this correct? [Yn]:
Ruby 1.9 以降で RubyGems が標準ライブラリになってるらしいので「12」にしてみた。
Select Runtime [ruby18]: 12
開始コマンドは上で作成した app.ry を ruby で実行。
Start Command: ruby app.rb
インフラは前回と同じくシンガポール。(どこでも良い)
Select Infrastructure: 4
完了後、記述ミス等がなければ勝手に動いてます。
これで PHP の時のように実行処理時間分ズレるようなコトはないはず。
でもやっぱり面倒ですね~
今のところ一番簡単な cron の代替えは Google Apps Script のトリガーかもしれない・・・