我有一个rake文件,可以在命令行成功执行。当我设置一个cronjob来运行这个rake文件时,“require'json'”行就失败了。我的猜测是cronjob有一个不同的env变量。当我试图将“put ENV”放在ruby脚本中时,它不起作用。所以我想知道我应该做些什么来检查不同的env变量以及如何解决问题。谢谢。
答案 0 :(得分:3)
可能是你在cron中调用它的方式。这对我有用:
cd /full/path/to/rails_root && /full/path/to/rake RAILS_ENV=production my:task
答案 1 :(得分:0)
你有吗
require 'rubygems'
在你的脚本中?例如。 irb
默认加载rubygems,而正常执行需要显式 import 。
答案 2 :(得分: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
。
答案 3 :(得分:0)
另一种方式:编写一个从cron运行的包装脚本: 第一行 - 加载.profile(或.bash_profile等) 第二行 - 运行你的rake脚本