by shigemk2

当面は技術的なことしか書かない

wheneverでcannot load such fileエラー

wheneverって何

javan/whenever · GitHub

wheneverとは、Rubyでcronを走らせることのできるgemのこと。

Rails on whenever

bundle exec wheneverize .

ってやると、Railsでもごにょごにょできる。

Rails3でバッチ処理を実行する » Slowly Days

Railsでの導入と具体的なフローは上にまかせます。

こんな風に書いたのね。

config/schedule.rb

every 1.minutes do
  runner "Tasks::HelloWorld.execute", :output => {:error => 'log/error.log', :standard => 'log/cron.log'}
end

エラー

taskを追加して、cronを走らせて、ログを見ると…

/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require': cannot load such file -- bundler/setup (LoadError)
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require'
    from /Users/shige/projects/keio-line-rails/config/boot.rb:4:in `<top (required)>'
    from bin/rails:3:in `require_relative'
    from bin/rails:3:in `<main>'

うえうえ。

まてまて。

$ ruby -v
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.4.0]

のはずなのに。なぜ別のバージョンを見にいってるのか。

crontabを見る

* * * * * /bin/bash -l -c 'cd /Users/shige/projects/hoge-rails && bin/rails runner -e production '\''Tasks::HelloWorld.execute'\'' >> log/cron.log 2>> log/error.log'

このcron、bashで実行されてやがる。

上のrubyはzshで実行されているのだ。

なので、bashのrubyのバージョンを1.9.3にしたらうまくいきました。

まとめ

wheneverで登録されるcronってzshで実行できないのかな。