Rails 6 に whenever をインストールする


はじめに

Rails 6 に whenever をインストールするためのメモ。

wheneverは、Rails でタスクを定期実行するためのRuby gemです。

環境

$ hostnamectl status
   Static hostname: ---
         Icon name: computer-container
           Chassis: container
        Machine ID: ---
           Boot ID: ---
    Virtualization: lxc
  Operating System: Ubuntu 20.04.2 LTS
            Kernel: Linux 5.4.0-67-generic
      Architecture: x86-64
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu]
$ bundle exec rails version
Rails 6.1.4

インストール

Gemfile に追加。

$ vim Gemfile

追記内容は以下。

gem 'whenever', require: false

Bundle を利用して、 whenever をインストール。

$ bundle install

スケジュール登録

schedule.rbを生成。

$ bundle exec wheneverize .
[add] writing `./config/schedule.rb'
[done] wheneverized!

schedule.rbを下記内容に編集。

set :output, File.join(Whenever.path, "log", "cron.log")
rails_env = ENV['RAILS_ENV'] || :development
env :PATH, ENV['PATH']
env :GEM_PATH, ENV['GEM_PATH']

every 1.minute do
  rake 'example_task:run'
end

タスク作成

rakeタスクを作成。

$ bundle exec rails generate task example_task
Running via Spring preloader in process 3029495
      create  lib/tasks/example_task.rake

生成したexample_task.rakeを編集。

$ vim lib/tasks/example_task.rake

生成したマイグレーションファイルを編集。

namespace :example_task do
  desc 'タスクを実行する'
  task run: :environment do
    puts "Run task"
  end
end

タスク実行

タスクを実行。

$ bundle exec rake example_task:run

正常に完了すると下記実行結果を表示。

Run task

Cronに反映

構文チェックを実施。

$ bundle exec whenever

構文に問題がなければ下記実行結果を表示。

* * * * * /bin/bash -l -c 'cd /home/ubuntu/projects/api && RAILS_ENV=development bundle exec rake example_task:run --silent >> /home/ubuntu/projects/api/log/cron.log 2>&1'

## [message] Above is your schedule file converted to cron syntax; your crontab file was not updated.
## [message] Run `whenever --help' for more options.

CRONに設定を反映。

$ bundle exec whenever --update-crontab

設定内容を確認。

$ crontab -l


# Begin Whenever generated tasks for: /home/ubuntu/projects/api/config/schedule.rb at: 2021-10-11 15:08:38 +0900
* * * * * /bin/bash -l -c 'cd /home/ubuntu/projects/api && RAILS_ENV=development bundle exec rake example_task:run --silent >> /home/ubuntu/projects/api/log/cron.log 2>&1'

# End Whenever generated tasks for: /home/ubuntu/projects/api/config/schedule.rb at: 2021-10-11 15:08:38 +0900

CRONの設定を削除。

$ bundle exec whenever --clear-crontab

参考サイト

GitHub

Railsでwheneverを使ってcronを設定する