スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

whenever を使って Rails で cron 的な

Railsでcronのようなバッチ処理を行うためにwheneverを使ってみます。Railsのバージョンは3.2.0。

【1】バッチファイル作成

Railsではバッチファイルなどのプログラムはlib配下に置きます。

とりあえず、バッチファイルを作成。

$ nano lib/tasks/hoge.rb

このファイルにテスト用のプログラムを書いておきます。

class Hoge
 def self.test
  print "This is test!\n"
 end
end




【2】libディレクトリのファイルをオートロードするように設定

lib以下のファイルをオートロードするようにconfig/application.rbを設定します。Applicationクラスの中に次の記述を追記します。

module Hogehoge
 class Application < Rails::Application

  (中略)

  # Custom directories with classes and modules you want to be autoloadable.
  # config.autoload_paths += %W(#{config.root}/extras)
  config.autoload_paths += %W(#{config.root}/lib)
  config.autoload_paths += Dir["#{config.root}/lib/**/"]

  (中略)

 end
end

追記後、次のコマンドが通ってバッチファイルに記述したテキストが表示されれば問題なく設定できています。

$ rails runner Hoge.test
 # => This is test!




【3】wheneverの設定

Gemfileに以下の行を追記。

gem 'whenever', :require => false

そして、次のコマンドを実行。

$ bundle install
$ wheneverize .

wheneverの設定ファイルであるconfig/schedule.rbが作成されます。ピリオドを落とさないように注意。
続いて、生成されたconfig/schedule.rbを編集。

set :environment, :development
set :output, { :error => 'log/error.log', :standard => 'log/cron.log' }

every 1.minutes do
 runner "Sync.test"
end

設定内容を確かめるために

$ whenever

すると、設定されるcronが表示されます。
この時点ではcrontabに設定が反映されていないので、設定内容を確認して

$ xhenever --update-crontab

で反映します。
ちなみに、

$ xhenever --clear-crontab

でwheneverによる設定内容の取り消しができます。

これでwheneverによるcronの設定は完了です――が、ここでエラー発生。

正常に動作すれば、バッチ処理により、log/cron.logに「This is test!」と出力されるはずなのですが、出力が一切ない。
というわけで、エラーの出力先であるlog/error.logを見てみると

could not find bcrypt-ruby-3.0.1 in any sources (BundlerGemNotfound)

とか書かれている。

Gemfileをチェックしたところ、「gem 'bcrypt-ruby'」は書かれていたので、bundle installするが、既にインストール済み。

wheneverによってcrontabに設定されてたコマンド

$ /bin/bash -l -c 'cd /home/username/railsroot && script/rails runner -e development '\''Hoge.test'\'

を直接実行してみたところ、次のようなエラーを頂く。

Could not find bcrypt-ruby-3.0.1 in any of the sources
Run `bundle install` to install missing gems.


よくわからないが、Bundler的にはbcrypt-rubyが入っているのに、Ruby的にはそれを認識してないってこと?

Ruby及びRailsはRVM上で動かしているため、とりあえず、

$ rvm all do gem install bcrypt-ruby -v "3.0.1"

して、RVMのgemを読み直すためにターミナルを再起動して、再び

$ /bin/bash -l -c 'cd /home/username/railsroot && script/rails runner -e development '\''Hoge.test'\'

を実行したみたところ、エラーメッセージが

Could not find chronic-0.6.7 in any of the sources
Run `bundle install` to install missing gems.

に変化した。同様に

$ rvm all do gem install chronic --version "0.6.7"

して入れてみると、また別のgemが無いとか言われる。

しばらく

$ /bin/bash -l -c 'cd /home/username/railsroot && script/rails runner -e development '\''Hoge.test'\'
$ rvm all do gem install hogehoge --version "0.0.0"
$ exit

を繰り返すも、一向に終わる気配なし。

遅々として進まない状況に嫌気が差して、ダメ元でbundle installしてみたところ、いくつかのgemがインストールされた。

「初めにbundle installしたときには何も起こらなかったのに、なんだよおい、ぶつぶつ……」などと思いながら

$ /bin/bash -l -c 'cd /home/username/railsroot && script/rails runner -e development '\''Hoge.test'\'

してみると、エラーを吐かれない。
しばらく放置してcronの動作も確認してみるが、やはりエラーは吐かれない。

原因がわからなくて超気持ち悪いんですが、とりあえず動いたので良しとしておきます。
超気持ち悪いけど!


《参考サイト》
https://github.com/javan/whenever
http://www.slowlydays.net/wordpress/?p=707

コメントの投稿

非公開コメント

カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
検索フォーム
カテゴリ
月別アーカイブ
最新記事
最新コメント
最新トラックバック
RSSリンクの表示
QRコード
QR
リンク
アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。