【发布时间】:2010-10-31 16:41:53
【问题描述】:
我有一个 rake 文件,可以在命令行成功执行。当我设置一个 cronjob 来运行这个 rake 文件时,“require 'json'”行失败了。我的猜测是 cronjob 有一个不同的环境变量。当我尝试将“puts ENV”放入 ruby 脚本时,它不起作用。所以我想知道我应该怎么做来检查不同的环境变量以及如何解决这个问题。谢谢。
【问题讨论】:
我有一个 rake 文件,可以在命令行成功执行。当我设置一个 cronjob 来运行这个 rake 文件时,“require 'json'”行失败了。我的猜测是 cronjob 有一个不同的环境变量。当我尝试将“puts ENV”放入 ruby 脚本时,它不起作用。所以我想知道我应该怎么做来检查不同的环境变量以及如何解决这个问题。谢谢。
【问题讨论】:
这可能是您在 cron 中调用它的方式。这对我有用:
cd /full/path/to/rails_root && /full/path/to/rake RAILS_ENV=production my:task
【讨论】:
你有吗
require 'rubygems'
在你的脚本中?例如。 irb 默认加载 rubygems,而 正常 执行需要显式 import。
【讨论】:
首先: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。
【讨论】:
另一种方式:编写一个包装脚本以从 cron 运行: 第一行 - 加载您的 .profile (或 .bash_profile 等) 第二行 - 运行你的 rake 脚本
【讨论】: