Perché mysqldump deve essere completamente percorso quando viene chiamato da un controller o modello?

StackOverflow https://stackoverflow.com/questions/1803728

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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top