2009-06-05 61 views
2

我有一個rake文件,它可以在命令行中成功執行。當我設置一個cronjob來運行這個rake文件時,「require'json'」行失敗。我的猜測是cronjob有一個不同的env變量。當我試圖在Ruby腳本中放置「puts ENV」時它不起作用。所以我想知道我該怎麼做來檢查不同的env變量以及如何解決這個問題。謝謝。Rake在cronjob中運行不正確

+0

您使用的是RVM嗎? – cbrulak 2011-01-06 17:18:45

回答

0

你有

require 'rubygems' 
在腳本

?例如。 irb默認加載rubygems,而正常執行需要顯式導入

+0

是的,我確實需要'rubygems'。如果我在命令行運行,rake data.rake,沒問題。錯誤只發生在cronjob上。 – swingfuture 2009-06-05 15:57:38

0

第一:require "json"可能因爲rubygems未加載而失敗。您可以通過將require 'rubygems'放置在頂部,或將RUBYOPT=rubygems添加到cron作業命令行的前面或cron的環境(通常可以在crontab中設置環境變量)來解決該問題。

回答您的ENV調試問題:puts ENV可能不起作用,因爲stdout會在cron作業期間重定向到您不知道的地方(它肯定無法進入您的終端)?你可以嘗試,而不是執行以下操作:

File.open('/tmp/debug_env', 'w') do |f| 
    f.puts ENV.to_hash.inspect 
end 

然後看看在/tmp/debug_env,看看那裏的東西。尤其要注意的環境變量是$USER,$GEM_HOME,$GEM_PATH,$RUBYOPT

+0

首先,我已經加載了rubygems,第二,我嘗試了你的建議,在cronjob的前面添加RUBYOPT = ruby​​gems,同樣的錯誤。我會嘗試ENV調試。 – swingfuture 2009-06-05 16:14:20

3

這可能是你如何在cron中調用它。下面是我的什麼作品:

cd /full/path/to/rails_root && /full/path/to/rake RAILS_ENV=production my:task 
0

這樣做的另一種方式:編寫一個包裝腳本從cron運行: 第一線 - 加載你的.profile文件(或.bash_profile文件等) 第二行 - 運行耙腳本