Perché mysqldump deve essere completamente percorso quando viene chiamato da un controller o modello?
-
05-07-2019 - |
Domanda
Quando chiamo mysqldump
da un controller o modello, devo tracciare completamente il binario, quando lo chiamo da Rake non è necessario.
Se non percorso completamente ottengo un file a zero byte ...
Posso confermare che entrambi i processi vengono eseguiti utilizzando lo stesso utente.
# 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}"
Se chiamo l'attività Rake dall'azione fallisce anche (file zero byte).
Sistema operativo: Mac Ruby 1.8.6
EDIT: utilizzo Etc.getpwuid (Process.uid) .name
per ottenere l'utente del processo corrente
Soluzione
Puoi sempre modificare la variabile d'ambiente PATH come richiesto, ovviamente. Qualcosa di simile è meglio farlo in environment.rb o nella configurazione del tuo ambiente specifico:
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(':')
In questo modo puoi aggiungere elementi arbitrari al tuo percorso se esistono sul tuo sistema.
Altri suggerimenti
Di recente ho scoperto che Passenger (mod_rails) non funziona in una shell come Mongrel, il che è ovvio se ci pensate. Pertanto non 'eredita' l'intero sistema $ PATH.