È sorprendente che il comando che mostri funzioni, dal momento che non riesci a citare gli spazi nel percorso del comando. Prova:
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);
Modifiche:
- Convertire il modulo a stringa singola nel modulo array di argomenti molto più sicuro di
exec
chiamare; - Raddoppia le barre rovesciate nel
rawDatabase
percorso poiché il comando originale non riesce a evitare le barre inverse, quindi\r
è un ritorno a capo nella stringa invece del\
char seguito dar
car. - Passa a barre inverse raddoppiate invece di barre in avanti nel percorso del programma per coerenza. Questa modifica probabilmente non ha importanza.
Controlla anche lo stato di restituzione del processo. Devi utilizzare Process.waitFor()
quindi, una volta terminato, utilizzare Process.exitValue()
per determinare il risultato. Dovresti esaminare lo stderr e lo stdout catturati dal Process
oggetto per errori e informazioni di registrazione.
Il motivo per cui il tuo programma continua a non funzionare è probabilmente perché:
- Hai un vecchio
pg_restore
processi in giro tenendo serrature; e/o - Non stai consumando stdout e stderr quindi
pg_restore
esaurisce lo spazio di pipe nel buffer e blocca la scrittura sul flusso di output.
Sarà tutto molto più semplice se usa ProcessBuilder
invece
. ProcessBuilder ti consente di fornire flussi di file su cui scrivere l'output e generalmente si occupa molto di questo per te. Devi comunque attendere che il processo termini e controllare il suo codice di ritorno.