wheneverというのはRuby on Railsのgemであり、crontabを設定する時によく使われています。
使い方
使い方はGithubホームページに詳しく記載されていますが、主に使うのは下記になります。
Gemfileに追加
Copy
Gemfile
1
gem 'whenever', require: false
インストール
Copy
schedule.rbファイルの内容を確認する
1
bundle exec wheneverize .
Copy
開発環境でcrontabを更新する
1
whenever
Copy
Capistranoに入れる
1
whenever --update-crontab --set environment='development'
Copy
config/deploy.rb
1
set :whenever_roles, -> { :app }
Copy
Capfile
1
require 'whenever/capistrano'
ハマったことなどの解決
EC2では動かない
EC2にデプロイの後、crontabが動かず、ログ確認したらBundleバージョンが間違いなどの問題
job_typeを以下に設定すれば良い
Copy
config/schedule.rb
1
2
set :output, environment == 'development' ? 'log/crontab.log' : '/deploy/apps/<アプリ名/shared/log/crontab.log'
job_type :rake, 'export PATH="$HOME/.rbenv/bin:$PATH"; eval "$(rbenv init -)"; cd :path && RAILS_ENV=:environment bundle exec rake :task :output'
時間通りに動かない
タイムゾーンが間違い可能性が高いです。
タイムゾーン設定方法は:
Copy
config/schedule.rb
1
2
3
4
5
6
7
8
9
10
11
require 'active_support'
require 'active_support/core_ext/time'
def jst(time)
Time.zone = 'Asia/Tokyo'
Time.zone.parse(time).localtime($system_utc_offset)
end
every 1.day, at: jst('6:00 am') do # 日本時間毎朝6時に実行
rake 'example:task'
end
crontabのログにExecJS::RuntimeUnavailable エラーが出たとき
Copy
Gemfileに1
Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
mini_racer
を追加すればいいです。therubyracer
でも大丈夫ですが、Macにはインストールが難しいのでmini_racer
を使います。
この記事はQiitaのマイページにも掲載しました。
Updated by Yuto at 2023-05-09 21:05