2009-11-26 26 views
0

當我從控制器或模型調用mysqldump時,我需要完全路徑二進制文件,當我從Rake調用它時,我不需要。爲什麼從控制器或模型調用mysqldump時需要完全運行?

如果我不完全路徑,我得到一個零字節文件...

我可以證實這兩個過程都使用相同的用戶運行。

# 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

你如何運行你的Rails應用程序?我認爲您應該檢查運行它的進程與運行Rake時有相同的環境(以及PATH變量)。 –

+0

這個過程在同一個用戶下運行,我不太確定這兩種情況下PATH的設置。 – Kris

+0

In Rails ENV ['PATH']是/ usr/bin:/ bin:/ usr/sbin:/ sbin 在Rake ENV ['PATH']中,它與我的系統$ PATH完全相同。 這是正常的嗎? – Kris

回答

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(':') 

這樣你就可以,如果他們在系統上存在的任意元素添加到您的路徑。

+0

這是否表明Ruby ENV ['PATH']與系統$ PATH是獨立的? – Kris

+0

您創建的任何shell都會繼承ruby進程的環境,就像ruby繼承父shell一樣。它不是獨立的,而是從系統PATH繼承而來。 – tadman

0

我最近發現Passenger(mod_rails)不在像Mongrel這樣的shell中運行,這在你思考它時很明顯。因此它不會''繼承'完整的系統$ PATH。

相關問題