Runtime.getRuntime().exec() メソッドを使用して Java コードから PostrgeSQL サーバーを再起動する機能を実装しようとしています。PostgreSQL サーバーで SSL が有効になっていない場合でも、このメソッドは正常に機能しますが、PostreSQL サーバーで SSL が有効になっていて、秘密鍵がパスワードで暗号化されている場合は、パスフェーズを渡す必要があります。同じものを実装するために以下のコードを試しましたが、
String postgreSQLRestartCMD =
"/u/postgreSQL/pg_ctl -D /u/postgreSQL/data restart -w";
//-w option waits until the passphase is sent
final Process restartPosgreSQLServer = Runtime.getRuntime().exec(postgreSQLRestartCMD);
PrintStream ps = new PrintStream(restartPosgreSQLServer.getOutputStream());
ps.println("keyPassword"); // sending passphasse here
new Thread(new Runnable() {
@Override
public void run() {
try {
IOUtils.copy(restartPosgreSQLServer.getInputStream(), logWriter);
}
catch (final IOException e) {
logWriter.println("Error occurred while reading InputStream.");
e.printStackTrace(logWriter);
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
IOUtils.copy(restartPosgreSQLServer.getErrorStream(), logWriter);
}
catch (final IOException e) {
logWriter.println("Error occurred while reading ErrorStream.");
e.printStackTrace(logWriter);
}
}
}).start();
int returnStatus = restartPosgreSQLServer.waitFor();
if (returnStatus == 1) {
logWriter.println("Error has occured while running PostgreSQL server.");
} else {
logWriter.println("PostgreSQL has started successfully.");
}
しかし、サーバーは起動していません。Linuxで試しています。コンソールでは、以下の行が表示され、passohase が適切に送信されていないと思います。
Enter PEM pass phrase:
これはどこで問題が発生し、パスフェーズが送信されないのはなぜですか?
編集
さらに掘り下げると、Runtime.getRuntime().exec(cmd) が新しいプロセスを作成していることがわかりました。私の ps.println("password") は親プロセスに渡されます。しかし、私の観察が正しいかどうかはわかりません。