4

Java プログラムで PostgreSQL サーバーを起動したいと考えています。このタスクでは、次のコードを使用しています。

ProcessBuilder pb = new ProcessBuilder(pgHome + "/bin/pg_ctl", "start");

Map<String, String> env = pb.environment();
env.put("PGDATA", pgDataDir);

Process p = pb.start();

InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
boolean started = false;

while (!started && (line = reader.readLine()) != null) {
    started = line.contains("database system is ready to accept connections");
}

if (!started) {
    throw new IllegalStateException("Unable to start PostgreSQL server");
}

同じオプションを使用してコマンド ラインで postgres サーバーを起動すると、次のメッセージが表示されます。

server starting
LOG:  database system was shut down at 2013-02-08 09:07:50 CET
LOG:  autovacuum launcher started
LOG:  database system is ready to accept connections

コマンドが戻る前に、最初の行 (サーバーの開始) が出力されます。以降のすべての行は、バックグラウンド プロセスによって出力されます。

私の Java コードは最初の行しか表示しませんが、LOG メッセージを解析したいと考えています。このようなバックグラウンド プロセスの入力を読み取る方法はありますか?

また、奇妙で再現性のない動作にも遭遇しました。コードをデバッグすると、LOG ステートメントを含む出力が完全に解析されます。最初はタイミングの問題だと思いましたが、プロセスを開始してから待ってもこれは変わりませんでした。

4

2 に答える 2

1

ほとんどpg_ctlの場合、実際のデータベースプログラムではありません。server startingこれは、最初の行を出力するが、データベースをバックグラウンドデーモンプロセスとして起動してから戻るスクリプトまたはラッパープログラムです。その新しいプロセスの出力ストリームをプログラムにアタッチすることはできません。

于 2013-02-08T08:38:09.590 に答える
0

必要な行はおそらく stderr に出力され、その場合はProcess.getErrorStream ().

于 2013-02-08T08:37:59.927 に答える