Cuộc sống Nhật Bản
Yuto Blog

【Ruby on Rails】EC2でwheneverを使ってcrontabを設定する時のハマったことの解決

HSBC - Mở thẻ tín dụng
Nội dung chính

wheneverというのはRuby on Railsのgemであり、crontabを設定する時によく使われています。

使い方

使い方はGithubホームページに詳しく記載されていますが、主に使うのは下記になります。

Gemfileに追加

Copy Gemfile
1
gem 'whenever', require: false

インストール

Copy
1
bundle exec wheneverize .
schedule.rbファイルの内容を確認する

Copy
1
whenever
開発環境でcrontabを更新する

Copy
1
whenever --update-crontab --set environment='development'
Capistranoに入れる
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
1
Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
Gemfileにmini_racerを追加すればいいです。therubyracerでも大丈夫ですが、Macにはインストールが難しいのでmini_racerを使います。

Updated at 2023-05-09
Nếu bài viết có ích thì các bạn hãy chia sẻ nhé
Rate this article: 4.9/5 (56 ratings)
You didn't rate yet
Le Minh Thien Toan

Tác giả:Yuto Yasunaga

Xin chào các bạn. Mình là kỹ sư IT đang làm việc ở Nhật Bản. Mình tạo blog này để chia sẻ về cuộc sống và những kinh nghiệm trong quá trình học tập và làm việc.
Hy vọng bài viết này sẽ có ích cho bạn.