【问题标题】:Why does mysqldump need to be fully pathed when called from a controller or model?为什么从控制器或模型调用 mysqldump 时需要完全路径?
【发布时间】:2009-11-26 13:41:05
【问题描述】:

当我从控制器或模型调用 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 红宝石 1.8.6

编辑:我使用Etc.getpwuid(Process.uid).name 获取当前进程的用户

【问题讨论】:

  • 如何运行 Rails 应用程序?我认为您应该检查运行它的进程是否与运行 Rake 时具有相同的环境(以及 PATH 变量)。
  • 进程在同一个用户下运行,我不太确定在这两种情况下 PATH 设置为什么。
  • 在 Rails ENV['PATH'] 中是 /usr/bin:/bin:/usr/sbin:/sbin 在 Rake ENV['PATH'] 中它与我的系统 $PATH 完全相同.这正常吗?

标签: ruby-on-rails ruby rake mysqldump


【解决方案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(':')

这样,您可以将任意元素添加到您的路径中(如果它们存在于您的系统中)。

【讨论】:

  • 这是否表明 Ruby ENV['PATH'] 独立于系统 $PATH?
  • 您创建的任何 shell 都会继承 ruby​​ 进程的环境,就像 ruby​​ 从父 shell 继承一样。它不是独立的,而是继承自系统PATH。
【解决方案2】:

我最近发现,Passenger (mod_rails) 不像 Mongrel 那样在 shell 中运行,仔细想想,这很明显。因此,它不会“继承”整个系统 $PATH。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多