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ů
execzavolat; - Zdvojte zpětná lomítka v
rawDatabasecestu, protože váš původní příkaz nedokáže uniknout zpětným lomítkům, takže\rje znak konce řádku v řetězci namísto\char následovaný znakemrchar. - 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_restoreprocesy visící kolem držení zámků; a/nebo - Nespotřebováváte stdout a stderr, takže
pg_restoredojde 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.