Why does mysqldump need to be fully pathed when called from a controller or model?
-
05-07-2019 - |
Question
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
Solution
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.
OTHER TIPS
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.