Redmine でチケットの期日3日前とか1日前とかに通知メールを送りたい場合、rake コマンドのsend_reminders を使います。
Redmine のインストールディレクトリで、以下の様な感じでやるわけです。
rake redmine:send_reminders days=1 RAILS_ENV=production
ただ、これを毎回人力でなんぞやっていられませんので、自動実行させたい。
そこで使うのがwhenever というgem と、Linux における定期実行機能のcrontab です。
Redmine に限らず、Rails アプリケーションで定期的な処理実行を行わせたい場合に使えるので、憶えておきましょう。
手順の流れ
- Gem をインストール
- crontab 設定用ファイルを生成
- crontab 設定用ファイルを編集
- crontab に設定内容を反映
- 動作確認
手順の詳細
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
参考
@uma_blue 普通にwhenever使ってましたよ
— daisuke furukawa (@mogya) 2016, 1月 13