コマンドパスのスペースを引用していないため、表示するコマンドがまったく機能するのは驚くべきことです。試す:
String[] cmd = {
"D:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_restore.exe",
"--host", "localhost",
"--port", "5432",
"--username", "postgres",
"--dbname", "mytestqq",
"--role", "postgres",
"--no-password",
"--verbose",
"D:\\sathish\\rawDatabase.backup"
};
p = r.exec(cmd);
変更点:
- 単一文字列形式をより安全な引数配列形式の
exec
呼び出しに変換します。
rawDatabase
元のコマンドがバックスラッシュのエスケープに失敗したため、パス内のバックスラッシュを 2 倍にします。つまり、char の後にchar が続く\r
のではなく、文字列内のキャリッジ リターンです。\
r
- 一貫性を保つために、プログラム パスでスラッシュの代わりに二重のバックスラッシュに切り替えます。この変更はおそらく重要ではありません。
また、プロセスの返却ステータスも確認してください。結果を判断するには、Process.waitFor()
使用を終了したら then を使用する必要があります。Process.exitValue()
オブジェクトによってキャプチャされた stderr と stdoutProcess
で、エラーとログ情報を調べる必要があります。
プログラムが引き続き動作しない理由は、おそらく次のとおりです。
- ロックを保持している古い
pg_restore
プロセスがぶら下がっています。および/または
- stdout と stderr を消費していないため
pg_restore
、バッファリングされたパイプ スペースが不足し、出力ストリームへの書き込みがブロックされます。
代わりにを使用するProcessBuilder
と、これはすべてはるかに簡単になります。ProcessBuilder を使用すると、出力を書き込むためのファイル ストリームを提供でき、通常はこれの多くを処理します。ただし、プロセスが終了してリターンコードを確認するまで待つ必要があります。