rvmの環境でのRubyスクリプトのcron実行
Ruby-1.9.3のrvm環境だとcronにスクリプトを組み込んでも問題なく実行できていたのに、rvmで2.2.1に更新するとなぜかcron時にgemが見つからないとのエラーが出るようになってしまった…(↓):
/usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- mechanize (LoadError) from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require' from /home/oshiro/sbiclient.rb:2:in `<top (required)>' from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require' from /usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
種々やって、よくわからんのだが、他でも色々と苦労されている模様:
- RVM: Ruby Version Manager – Using Cron with RVM
- 1. Direct calling RVM generated wrappers.
- 2. Loading RVM environment files in shell scripts.
- 3. Direct calling custom RVM wrappers (eg. God).
- 4. Loading and using RVM in shell scripts.
- 橋本商会 » crontabでRVMのRubyを使う
- cronでRVMのRubyを使う | Pistolfly
- crontab: ruby スクリプトを実行する | deadwood
直接rvm上のrubyバイナリをバージョン番号付きで呼び出せとか、rvm側を呼び出すよう別のシェルスクリプトを組めだとか、何やら訳のわからない解決策がぞろぞろ。
次のページには「rvm cron setup」を使えとの記述が:
- coderwall.com : establishing geek cred since 1305712800
- rvm use …. # select the ruby you want to use
- rvm cron setup # let RMV do your cron settings
- crontab -e # add a new cronjob
これをやってみると、自身のcrontabファイルの冒頭に下記のようなrvm環境の設定が付け加わるようになり、実行も問題なく行なえるようになった。
#sm start rvm PATH="/usr/local/rvm/gems/ruby-2.2.1/bin:/usr/local/rvm/gems/ruby-2.2.1@global/bin:/usr/local/rvm/rubies/ruby-2.2.1/bin:/usr/local/rvm/gems/ruby-2.2.1/bin:/usr/local/rvm/gems/ruby-2.2.1@global/bin:/usr/local/rvm/rubies/ruby-2.2.1/bin:/usr/local/rvm/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:" GEM_HOME='/usr/local/rvm/gems/ruby-2.2.1' GEM_PATH='/usr/local/rvm/gems/ruby-2.2.1:/usr/local/rvm/gems/ruby-2.2.1@global' MY_RUBY_HOME='/usr/local/rvm/rubies/ruby-2.2.1' IRBRC='/usr/local/rvm/rubies/ruby-2.2.1/.irbrc' RUBY_VERSION='ruby-2.2.1' #sm end rvm ...
[追記]
上記の環境変数をコメントアウトして、ひとつずつ有効にして試してみたら、とりあえず自分の使い方であれば以下でも動作した:
#sm start rvm PATH="/usr/local/rvm/rubies/ruby-2.2.1/bin" GEM_HOME='/usr/local/rvm/gems/ruby-2.2.1' #sm end rvm ...
PATHの設定は/usr/local/rvm/rubies/ruby-2.2.1/bin/rubyを呼び出すためのものだが、次のように/usr/local/binに’ln -s’しておいて、PATHには/usr/local/binを指定しても動作した。
ln -s /usr/local/rvm/rubies/ruby-2.2.1/bin/ruby /usr/local/bin/
#sm start rvm PATH="/usr/local/bin" GEM_HOME='/usr/local/rvm/gems/ruby-2.2.1' #sm end rvm ...
また、GEM_HOMEの指定はGEM_PATHのどちらかでもいいらしい。
それと、cronに指定するのがスクリプトファイルで、その冒頭でrubyのパスを指定しているのであれば、環境変数のPATHはなくてもいいらしい。