Je překvapivé, že vámi zobrazený příkaz vůbec funguje, protože v cestě příkazu neuvádíte mezery. Zkuste:
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);
Změny:
- Převeďte jednořetězcovou formu na mnohem bezpečnější formu pole argumentů
exec
zavolat; - Zdvojte zpětná lomítka v
rawDatabase
cestu, protože váš původní příkaz nedokáže uniknout zpětným lomítkům, takže\r
je znak konce řádku v řetězci namísto\
char následovaný znakemr
char. - Přepněte na zdvojená zpětná lomítka namísto dopředných lomítek na cestě programu, abyste zajistili konzistenci. Tato změna pravděpodobně nevadí.
Zkontrolujte také stav vrácení procesu. Musíte použít Process.waitFor()
poté, jakmile bude ukončen, použijte Process.exitValue()
k určení výsledku. Měli byste prozkoumat stderr a stdout zachycené Process
objekt pro chyby a protokolování informací.
Důvod, proč váš program nadále nefunguje, je pravděpodobně následující:
- Máte staré
pg_restore
procesy visící kolem držení zámků; a/nebo - Nespotřebováváte stdout a stderr, takže
pg_restore
dojde místo ve vyrovnávací paměti a blokuje zápis ve výstupním proudu.
To vše bude mnohem jednodušší, pokud použijte ProcessBuilder
místo
. ProcessBuilder vám umožňuje poskytovat datové proudy souborů pro zápis výstupu a obecně se o mnohé postará za vás. Stále však musíte počkat na ukončení procesu a zkontrolovat jeho návratový kód.