我正在尝试使用 Runtime.getRuntime().exec() 方法实现从 Java 代码重新启动 PostrgeSQL 服务器的功能。如果 PostgreSQL 服务器未启用 SSL,但如果 PostreSQL 服务器启用了 SSL,并且如果私钥使用密码加密,则该方法工作正常,则需要通过 passphase。我尝试使用以下代码来实现相同的功能,
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:
这哪里出错了,为什么没有发送 passphase?
编辑
进一步挖掘后,我发现 Runtime.getRuntime().exec(cmd) 正在创建新进程,我的 ps.println("password") 被传递给父进程。但我不确定,我的观察是否正确。