Rails の定期実行ジョブはwhenever で

投稿者: | 2016/01/15

Redmine でチケットの期日3日前とか1日前とかに通知メールを送りたい場合、rake コマンドのsend_reminders を使います。
Redmine のインストールディレクトリで、以下の様な感じでやるわけです。

rake redmine:send_reminders days=1 RAILS_ENV=production 

ただ、これを毎回人力でなんぞやっていられませんので、自動実行させたい。
そこで使うのがwhenever というgem と、Linux における定期実行機能のcrontab です。

Redmine に限らず、Rails アプリケーションで定期的な処理実行を行わせたい場合に使えるので、憶えておきましょう。

手順の流れ

  1. Gem をインストール
  2. crontab 設定用ファイルを生成
  3. crontab 設定用ファイルを編集
  4. crontab に設定内容を反映
  5. 動作確認

手順の詳細

1. Gem をインストール

Gemfile を編集します。

# Use 'whenever' for crontab scheduling
gem 'whenever', require: false

bundle install します。

bundle install

2. crontab 設定用ファイルを生成

crontab を設定するためのファイル(config⁄schedule.rb )を生成させます。

bundle exec wheneverize .

3. crontab 設定用ファイルを編集

生成されたcrontab 設定用ファイルを編集して、定期実行タスクを用意します。

ちなみに、whenever のおけるスケジューリング可能なコマンドは以下の4つだそうです。

  • command: bash コマンドの実行
  • rake: rake タスクの実行
  • runner: Rails 内のメソッド実行
  • script: script の実行
# ログ出力先ファイルを指定
set :output, 'log/crontab.log'
# ジョブ実行環境を指定
set :environment, :production

# [例] 1時間に1回
every 1.hours do
  # bash コマンドの実行例
  command "echo 'hello, whenever world!'"
end

# [例] 毎日04:30
every 1.day, at: '4:30 am' do
  # rake タスクの実行例
  rake 'redline:send_reminder users=1 days=3 RAILS_ENV=production'
end

# [例] 毎週日曜18:00
every :sunday, at: '18:00' do
  # Rails 内のメソッド実行例
  runner 'MyController.method_hoge'
end

# [例] 毎週月曜〜金曜06:00(crontab 形式)
every '0 6 0 0 1-5 ' do
  # script の実行
  script '/home/hoge/rails_project/lib/assets/piyo.sh'
end

4. crontab に設定内容を反映

config⁄schedule.rb に設定した内容をcrontab に反映させます。
シェルで以下を叩くだけ。

sudo bundle exec whenever --update-crontab RAILS_ENV=production

5. 動作確認

crontab -l で設定内容がどの様に変換されてcrontab に反映されたかを確認できます。

sudo crontab -l

crontab の設定内容をクリア

登録内容をクリアしたい場合もあると思います。
そんなときは、下記を実行するとwhenever 経由で登録されたジョブだけが削除されます。

sudo bundle exec whenever --clean-crontab RAILS_ENV=production

参考


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータがどう処理されているか知りたい方はこちらをお読みください