Ruby on Railsのアプリケーションにて、本番環境でバッチ処理を行いたい
発生している問題
現在デプロイはエラーなく完了していますが、バッチ処理は行われていない状況です。
試したこと
まずはEC2にSSH接続して、アプリケーションのディレクトリに移動し、
(capistranoを利用しているので /アプリケーション名/current にて)
crontab -l
を叩くと、
@reboot /bin/bash --login /home/ec2-user/puma.sh >> /home/ec2-user/cron.log
こちらが結果です。
ちなみに開発環境でcrontab -lを叩くと、
# Begin Whenever generated tasks for: /home/vagrant/work/アプリケーション名/config/schedule.rb at: 2020-06-22 11:31:51 +0000 33 11 * * * /bin/bash -l -c 'cd /home/vagrant/work/アプリケーション名 && bundle exec bin/rails runner -e development '\''Batch::Relationship.relationship'\'' >> log/cron.log 2>&1' # End Whenever generated tasks for: /home/vagrant/work/MyHyles/config/schedule.rb at: 2020-06-22 11:31:51 +0000
上の結果が出てきます。
どうやらwheneverの翻訳(?)などができていないのかと予測し、開発環境で使った以下のコマンドを試しました。
bundle exec whenever RAILS_ENV=production
すると
bundler: failed to load command: whenever (/home/ec2-user/アプリケーション名/shared/bundle/ruby/2.5.0/bin/whenever) LoadError: Could not load the 'listen' gem. Add `gem 'listen'` to the development group of your Gemfile
とエラーが出ます。
さらに下に表示されたエラー文の中で怪しいのが
config/schedule.rb:2:in `require' config/schedule.rb:2:in `initialize'
でした。これはバッチ処理のために編集したファイルです。
その config/schedule.rb:2には、
require File.expand_path(File.dirname(__FILE__) + "/environment")
こちらが記述されています。
補足
expand_pathについて調べてみて、パスを返すということは分かりましたが、requireの本質も分かっておらず、問題点が特定できませんでした。
もしかしたらそもそも「bundle exec whenever RAILS_ENV=production」を試すこと自体間違っているのかもしれません。
エラー文に出ていたlisten gemについても調べましたがよく分からず、今gemfileでは
group :development do gem 'listen', '>= 3.0.5', '< 3.2' end
と記述されています。これはRailsのデフォルトなので、いじらないようにしています。(調べていてもlistenを本番環境でbundle installしましょうという内容は見当たりませんでした。)
こちらの問題を特定していただけるととても助かります。どうかお分かりになる方、力をお貸しいただけると幸いでございます。
バージョン
Rails 5.2.4.3
ruby 2.5.7p206 (2019-10-01 revision 67816) [x86_64-linux]
Gemfile.lockにてwheneverの記述
whenever (1.0.0)
chronic (>= 0.6.3)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/01 06:10