Ruby on Railsを用いたcron管理でのcannot load such fileエラーについて
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,135
Rails4.2.4でwheneverを利用してcronを管理しようとしており、
以下の記事を参考にして、諸々設定を行いましたが上手く動作しません。
■やったこと
・config/application.rbにオートロードの設定を記述
・config/schedule.rbにファイルや実行間隔を記述
・lib/tasks/get_feed_task.rbに定期実行する処理を記述
■参考記事
1:https://www.nxsw.co.jp/articles/2013/rails-application-feedzirra.html
2:https://www.nxsw.co.jp/articles/2013/rails-application-whenever.html
実行ログはlog/cron.log, log/whenever.logに残るようになっているのですが、
log/cron.logは何も更新されず、log/whenever.logは30分おきに以下のエラーが更新されます。
■エラーの内容
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- bundler (LoadError)
from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /home/vagrant/workspace/work/fashion_scraping_website/bin/spring:8:in `<top (required)>'
from bin/rails:3:in `load'
from bin/rails:3:in `<main>'
調べたところ、cannot load such fileというエラーが出るときはバージョンに起因することがあるようなのですが、
今回は rails new をしていないので参考になりそうな記事を読んでも解決法がわかりません…。
■参考記事
http://qiita.com/jnchito/items/f3bde6e46afbeba8cb82
各ファイルへの記述内容、エラーログにあった/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36周辺の内容は以下のとおりです。
原因や解決方法を原因をご存知でしたら、お教えいただけませんでしょうか…。どうかよろしくお願いします。
■config/application.rb
require File.expand_path('../boot', __FILE__)
require 'rails/all'
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)
module FashionScraping
class Application < Rails::Application
# オートロードの設定 ※1番上か下の記述のみで良さそう
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
config.autoload_paths << "#{Rails.root}/lib"
# Do not swallow errors in after_commit/after_rollback callbacks.
config.active_record.raise_in_transactional_callbacks = true
end
end
■config/schedule.rb
set:output, {:error =>'log/whenever.log', :standard=>'log/cron.log'}
every 30.minutes do
runner "Tasks::GetFeedTask.execute"
end
■lib/tasks/get_feed_task.rb
class Tasks::GetFeedTask
require 'feedjira'
def self.execute
~略~
end
end
■/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36周辺の内容
def require path
if Gem.unresolved_deps.empty? then
gem_original_require path
else
spec = Gem::Specification.find { |s|
s.activated? and s.contains_requirable_file? path
}
unless spec then
found_specs = Gem::Specification.find_in_unresolved path
unless found_specs.empty? then
found_specs = [found_specs.last]
else
found_specs = Gem::Specification.find_in_unresolved_tree path
end
found_specs.each do |found_spec|
found_spec.activate
end
end
return gem_original_require path
end
rescue LoadError => load_error
if load_error.message.start_with?("Could not find") or
(load_error.message.end_with?(path) and Gem.try_activate(path)) then
return gem_original_require(path)
end
raise load_error
end
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
情報が不足しているのと、同じ環境で確かめられないので、的外れだったらゴメンナサイ。
先ずは、Rails4をインストールされた方法を再確認してみてください。また、その時のシェル環境はどの様なものでしたか?
恐らく、wheneverが前提としているRubyのバージョンと、crontabが参照しているRubyのバージョン(こちらはシステムのデフォルトのバージョン)が違っている為のエラーだと思います。
それで、下記ページの情報が参考になると思います。
wheneverでcannot load such fileエラー
問題解決の一助になれば幸いです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/01/02 16:15
Rail4は以下の記事を基にインストールしました。
http://www.d-wood.com/blog/2013/09/25_4699.html
シェルはzshを使っています。
※詳しい方から、bash → zshに変更していただきました。
お教えいただいた記事を読んだところ、
自分の状況と同じ原因のように思いました。
解決法として「bashのrubyのバージョンを1.9.3」とあるのですが、
方法を調べてもよく分からず、
代わりにcronの読み込み先をzshにする?という方法を下記記事のとおり試しました。
http://qiita.com/github0013@github/items/806906d6743a5a770656
そしたら今度はlog/cron.log, log/whenever.logが更新されなくなってしまい、
何処に原因があるのか調査できなくなってしまいました…。
※bundle exec whenever --update-crontabコマンドを入力して
[write] crontab file updatedされたのでcronの更新はできているはずなのですが…。
原因などの当たりはございますでしょうか…。
2016/01/02 16:25
ログファイルが更新されないと思っていましたが、
再度確認したところlog/whenever.logに下記エラーが更新されていました。
zsh:1: command not found: bundle
改めて原因等を調べてみます。
2016/01/02 20:22
そしてrbenvでインストールされたRuby環境の上にRails他をインストールされているのですよね?
そうであれば、rbenvでインストールされたRubyのバージョンと、システムに標準でインストールされているRubyのバージョンが異なることが原因だと思います。
まずは、rbenvでインストールされているRubyのバージョンは何ですか?
ひょっとしたら下記の「rbenv をシステムワイドにインストールする手順」が役立つかもしれません。
> http://office.tsukuba-bunko.org/ppoi/entry/systemwide-rbenv
2016/01/02 22:55
はい、ubuntuを使っており、
rbenvでインストールされたRuby環境の上にRails他をインストールしました。
また、インストールしたRubyは2.2.3(ruby2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux])です。
おかげさまで進展があり、先ほどの zsh:1: command not found: bundle は以下記事の方法で解決しました。
http://qiita.com/satomin/items/c85ca362066bf5bf61cc
その後、 `fork': Cannot allocate memory - fork(2) (Errno::ENOMEM)というエラーが出たのですが、以下の記事を基に bin/spring stopコマンドを使ったら解決しました。
http://qiita.com/bibio/items/58806063bd2365a9832a
しかしその次は `table_structure': Could not find table 'ja_articles' (ActiveRecord::StatementInvalid)
というエラーがconfig/whenever.logに吐かれるようになりました。
実際には'ja_articles'というテーブルは作成済みで、
CRONを使用しない場合は正常にDBを操作することができていました。
※今回CRONで処理したい内容は元々コントローラに記述しており、
ブラウザにアクセスしたときにDB操作が正常にできていたため。
今回コントローラの記述をCRONで実行しようとしたら、
一連のエラーが発生するようになりました…。
そこで、諸々調べて以下2つを試してみたが解決できません…。
※参考記事1:http://stackoverflow.com/questions/11107880/rake-task-running-in-cron-cant-find-database-table
※参考記事2:http://stackoverflow.com/questions/21232643/error-with-activerecord-3-1-11-could-not-find-table-activerecordstatement-in
そもそも上記記事の内容を実行した結果
production環境のDBが正常にできたのか確認する方法も把握できておらず…。
2016/01/02 23:28
上記エラーに加えて、また`fork': Cannot allocate memory - fork(2) (Errno::ENOMEM)というエラーが出るようになってしまいました…。
/home/vagrant/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/spring-1.4.4/lib/spring/application.rb:156:in `fork': Cannot allocate memory - fork(2) (Errno::ENOMEM)
> from /home/vagrant/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/spring-1.4.4/lib/spring/application.rb:156:in `serve'
> from /home/vagrant/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/spring-1.4.4/lib/spring/application.rb:131:in `block in run'
> from /home/vagrant/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/spring-1.4.4/lib/spring/application.rb:125:in `loop'
> from /home/vagrant/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/spring-1.4.4/lib/spring/application.rb:125:in `run'
> from /home/vagrant/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/spring-1.4.4/lib/spring/application/boot.rb:18:in `<top (required)>'
> from /home/vagrant/.rbenv/versions/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
> from /home/vagrant/.rbenv/versions/2.2.3/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
> from -e:1:in `<main>'
2016/01/10 20:03
ご回答ありがとうございました!