コントローラーまたはモデルから呼び出されたときにmysqldumpを完全にパスする必要があるのはなぜですか?

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

質問

コントローラーまたはモデルから 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を「継承」しない

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top