0
0

More than 3 years have passed since last update.

【Rails】gem wheneverで定期実行する方法

Posted at

目的

現在制作中の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

参考にした記事
https://kyoto-diary.com/rails-whenever-cron/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0