Ruby Rake在cronjob中未正常运行

Ruby Rake在cronjob中未正常运行,ruby,cron,rake,Ruby,Cron,Rake,我有一个rake文件,可以在命令行中成功执行。当我设置一个cronjob来运行这个rake文件时,“require'json'行”失败了。我猜cronjob有一个不同的env变量。当我试图在ruby脚本中添加“puts ENV”时,它不起作用。所以我想知道我应该做什么来检查不同的环境变量,以及如何解决这个问题。谢谢 你有吗 require 'rubygems' 在你的剧本里?例如,irb默认加载rubygems,而正常执行需要显式导入。首先:需要“json”可能会失败,因为rubygems没有

我有一个rake文件,可以在命令行中成功执行。当我设置一个cronjob来运行这个rake文件时,“require'json'行”失败了。我猜cronjob有一个不同的env变量。当我试图在ruby脚本中添加“puts ENV”时,它不起作用。所以我想知道我应该做什么来检查不同的环境变量,以及如何解决这个问题。谢谢

你有吗

require 'rubygems'
在你的剧本里?例如,
irb
默认加载rubygems,而正常执行需要显式导入。

首先:
需要“json”
可能会失败,因为rubygems没有加载。您可以将
require'rubygems'
放在顶部,或者将
RUBYOPT=rubygems
添加到cron作业命令行的前面或cron的环境中(通常可以在crontab中设置环境变量),来解决这个问题

回答您的
ENV
调试问题:是否有可能
puts ENV
不工作,因为在cron作业期间,stdout被重定向到了您不知道的某个地方(它肯定无法转到您的终端)?您可以尝试以下方法:

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

然后查看
/tmp/debug_env
中的内容。需要特别注意的环境变量有
$USER
$GEM\u HOME
$GEM\u PATH
$RUBYOPT
,这可能是您在cron中调用它的方式。以下是对我有效的方法:

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

另一种方法是:编写从cron运行的包装器脚本: 第一行-加载您的.profile(或.bash_profile等)
第二行-运行rake脚本

是的,我确实需要“rubygems”。如果我运行命令行,rake data.rake,没有问题。错误只发生在cronjob上。首先,我确实加载了rubygems,其次,我尝试了您的建议,将RUBYOPT=rubygems添加到cronjob的前面,同样的错误。我将尝试环境调试。