views:

171

answers:

2

When I call mysqldump from a controller or model I need to fully path the binary, when I call it from Rake I don't need to.

If I do not fully path I get a zero byte file...

I can confirm both processes are run using the same user.

# 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}"

If I call the Rake task from the action it also fails (zero byte file).

OS: Mac Ruby 1.8.6

EDIT: I use Etc.getpwuid(Process.uid).name to get the User of the current process

+1  A: 

You can always modify your PATH environment variable as required, of course. Something like this is best done in environment.rb or your specific environment config:

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

This way you can add arbitrary elements to your path if they exist on your system.

tadman
Would this suggest that the Ruby ENV['PATH'] is independent from the system $PATH?
Kris
Any shells you create inherit the environment of the ruby process, just as ruby inherits from the parent shell. It's not independent, but inherited from the system PATH.
tadman
A: 

I recently found out Passenger (mod_rails) does not run in a shell like Mongrel, which is obvious when you think about it. Therefore it does not 'inherit' the full system $PATH. My solution was the same tadman's.

Kris