コントローラーまたはモデルから呼び出されたときにmysqldumpを完全にパスする必要があるのはなぜですか?
-
05-07-2019 - |
質問
コントローラーまたはモデルから mysqldump
を呼び出す場合、バイナリを完全にパスする必要があります。Rakeから呼び出す場合、必要はありません。
完全にパスしない場合、ゼロバイトファイルが取得されます...
同じユーザーを使用して両方のプロセスが実行されていることを確認できます。
# 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}"
アクションからRakeタスクを呼び出すと、失敗します(ゼロバイトファイル)。
OS:Mac Ruby 1.8.6
編集: Etc.getpwuid(Process.uid).name
を使用して、現在のプロセスのユーザーを取得します
解決
もちろん、必要に応じてPATH環境変数をいつでも変更できます。このようなことは、environment.rbまたは特定の環境設定で行うのが最適です:
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(':')
この方法では、システムに存在する任意の要素をパスに追加できます。
他のヒント
最近、Passenger(mod_rails)がMongrelのようなシェルで実行されないことがわかりました。したがって、システム全体の$ PATHを「継承」しない 。
所属していません StackOverflow