2012-09-10 30 views
1

在我的Ruby腳本,我需要的Gmail的寶石:爲什麼bash -l -c「CMD」讓紅寶石找到我的寶石?

require 'rubygems'
require 'gmail'

在shell中運行時,它的工作原理確定:

ruby my-script.rb

而當我把它放在一個cron作業,它未能執行:

* * * * * cd /to/script/directory;/usr/local/rvm/rubies/ree-1.8.7-2011.03/bin/ruby ./my-script.rb

日誌顯示,Gmail的寶石不能加載:

/usr/local/rvm/rubies/ree-1.8.7-2011.03/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require': no such file to load -- gmail (LoadError)

很好,當我做到這一點(把在bash的CMD -l -c 'CMD'):

* * * * * /bin/bash -l -c 'cd /to/script/directory;/usr/local/rvm/rubies/ree-1.8.7-2011.03/bin/ruby ./my-script.rb'

它再次正常工作。

爲什麼?

ps.我知道參數-l使bash成爲登錄shell,但這有什麼區別嗎?

回答

6

-l參數在登錄shell中執行命令,這意味着它從您的shell配置文件繼承了您的路徑和其他設置。如果在沒有登錄shell的情況下運行cron作業,將在沒有設置任何路徑環境變量(比如由RVM設置的那些變量)的情況下運行,這導致系統無法找到引用的gem。

+0

謝謝,很清楚 – DiveInto

2

我懷疑你是在你的登錄腳本中加載RVM,ergo RVM只能在登錄shell中使用。

3

rvm要求您使用shell登錄名,請參閱FAQ