目的
現在制作中のrailsアプリにおいて、楽天APIからゴルフ場情報を取得、DBに保存して、変更、追加があったらDBを更新する処理を定期的に実行する必要が出てきました。
wheneverというgemを使うと、簡単にcronを回すことができます。
※cronとは、UNIX系のOSで動いている定期実行プログラムです。
導入
gemfileに追加。
gem 'whenever', require: false
インストール実行。
$ bundle install
設定用の初期ファイルの生成
$ bundle exec wheneverize .
このコマンドを実行すると、config/schedule.rbというファイルが生成されます。
定期実行する処理を実装する
lib/tasks/whenever_test.rakeというファイルを作ります。
# lib/tasks/whenever_test.rake
namespace :whenever_test do # ファイル名と合わせること
desc 'テスト'
task test: :environment do
# ここに定期実行する処理を記述する。
puts 'hoge'
end
end
次に、taskが問題なく作られたか確認してみます。
$ rails -T
を実行すると、taskの一覧がみれます。
先ほど作った、whenever_test:testがあれば問題ないです。
$ rails whenever_test:test
を実行しても手動で実行可能です。
定期実行する頻度の設定
$ bundle exec wheneverize .
で生成したshedule.rbを編集していきます。
# config/schedule.rb
set :output, 'log/crontab.log'
set :environment, ENV['RAILS_ENV']
every 1.minute do
rake "whenever_test:test"
end
今回は1分に一回の頻度で実行します。これで頻度の設定は終わりです。
cronの実行
最後に、cronにて実行させる処理を設定します。
※wheneverというgemは使いますが、定期実行するのはあくまでcronになります。
先ほど作成したrakeファイルが存在するか次のコマンドで確認。
$ bundle exec whenever
問題なければ、次のコマンドでcrontabをアップデート
$ bundle exec whenever --update-crontab
crontabをカラにして、定期実行を辞めたいときはこのコマンド。
$ bundle exec whenever --clear-crontab
log/crontab.logを確認して、'hoge'が出力されていれば、完了です。
参考
私の場合、理由はわかりませんが、wheneverで発行したcronのRAILS_ENVがproductionになっていたため、productionの設定を読み込んでしまってエラーがでておりました。
なので、開発環境で実行するには、このコマンドで行けました。
$ RAILS_ENV=development bundle exec whenever --update-crontab