当我从控制器或模型中调用mysqldump
时,我需要完全路径二进制文件,当我从Rake调用它时我不需要。
如果我没有完全路径,我会得到一个零字节文件...
我可以确认两个进程都是使用同一个用户运行的。
# Works in a controller, model and Rake task
system "/usr/local/mysql/bin/mysqldump -u root #{w.database_name} > #{target_file}"
# Only works in a Rake task
system "mysqldump -u root #{w.database_name} > #{target_file}"
如果我从动作中调用Rake任务,它也会失败(零字节文件)。
操作系统:Mac Ruby 1.8.6
编辑:我使用Etc.getpwuid(Process.uid).name
来获取当前流程的用户
答案 0 :(得分:1)
当然,您始终可以根据需要修改PATH环境变量。这样的事情最好在environment.rb或您的特定环境配置中完成:
add_paths = %w[ /usr/local/mysql/bin /opt/local/bin ]
ENV['PATH'] = (ENV['PATH'].split(/:/) + add_paths).uniq.select do |p|
File.exist?(File.expand_path(p))
end.join(':')
这样,您可以在路径中添加任意元素(如果它们存在于您的系统中)。
答案 1 :(得分:0)
我最近发现Passenger(mod_rails)不会像Mongrel一样在shell中运行,这在您考虑时很明显。因此它不'继承'完整系统$ PATH。