質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.96%

Ruby on Railsを用いたcron管理でのcannot load such fileエラーについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,701

uyamik

score 17

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

情報が不足しているのと、同じ環境で確かめられないので、的外れだったらゴメンナサイ。

先ずは、Rails4をインストールされた方法を再確認してみてください。また、その時のシェル環境はどの様なものでしたか?

恐らく、wheneverが前提としているRubyのバージョンと、crontabが参照しているRubyのバージョン(こちらはシステムのデフォルトのバージョン)が違っている為のエラーだと思います。

それで、下記ページの情報が参考になると思います。

    wheneverでcannot load such fileエラー  

問題解決の一助になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 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

    こちら引き続き解決法を模索してみます。
    ご回答ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる