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

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

新規登録して質問してみよう
ただいま回答率
85.50%
cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

3414閲覧

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

T.N.

総合スコア22

cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/01/02 01:22

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

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

[wheneverでcannot load such fileエラー](http://www.shigemk2.com/entry/2014/02/15/whenever%E3%81%A7cannot_load_such_file%E3%82%A8%E3%83%A9%E3%83%BC)

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

投稿2016/01/02 05:00

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.N.

2016/01/02 07: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の更新はできているはずなのですが…。 原因などの当たりはございますでしょうか…。
T.N.

2016/01/02 07:25

※自己レスすみません。 ログファイルが更新されないと思っていましたが、 再度確認したところlog/whenever.logに下記エラーが更新されていました。 zsh:1: command not found: bundle 改めて原因等を調べてみます。
pi-chan

2016/01/02 11:22

参考になさったページの内容からすると、uyamikさんがRailsをインストールされたのはUbuntu(すくなくともDebian系)サーバですよね? そしてrbenvでインストールされたRuby環境の上にRails他をインストールされているのですよね? そうであれば、rbenvでインストールされたRubyのバージョンと、システムに標準でインストールされているRubyのバージョンが異なることが原因だと思います。 まずは、rbenvでインストールされているRubyのバージョンは何ですか? ひょっとしたら下記の「rbenv をシステムワイドにインストールする手順」が役立つかもしれません。 > http://office.tsukuba-bunko.org/ppoi/entry/systemwide-rbenv
T.N.

2016/01/02 13: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が正常にできたのか確認する方法も把握できておらず…。
T.N.

2016/01/02 14: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>'
T.N.

2016/01/10 11:03

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問