Pourquoi mysqldump doit-il être entièrement redirigé lorsqu'il est appelé depuis un contrôleur ou un modèle?
-
05-07-2019 - |
Question
Lorsque j'appelle mysqldump
depuis un contrôleur ou un modèle dont j'ai besoin pour acheminer complètement le binaire, lorsque je l'appelle depuis Rake, je n'ai pas besoin de le faire.
Si je ne suis pas complètement sur le chemin, j'obtiens un fichier de zéro octet ...
Je peux confirmer que les deux processus sont exécutés avec le même utilisateur.
# 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}"
Si j'appelle la tâche Rake à partir de l'action, elle échoue également (fichier de zéro octet).
OS: Mac Ruby 1.8.6
EDIT: j'utilise Etc.getpwuid (Process.uid) .name
pour obtenir l'utilisateur du processus en cours
La solution
Vous pouvez toujours modifier votre variable d’environnement PATH selon vos besoins, bien sûr. Il est préférable de procéder de la sorte dans environment.rb ou dans votre configuration d’environnement spécifique:
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(':')
De cette façon, vous pouvez ajouter des éléments arbitraires à votre chemin s'ils existent sur votre système.
Autres conseils
J'ai récemment découvert que Passenger (mod_rails) ne s'exécutait pas dans un shell comme Mongrel, ce qui est évident quand on y pense. Par conséquent, il n'hérite pas du système complet $ PATH.