2 回答

TA貢獻1802條經驗 獲得超6個贊
你沒有捕獲 的輸出pg_dump。您可以使用 Go 來做到這一點,也可以使用pg_dump-s --file。它還可以壓縮,--compress因此無需通過管道傳輸到gzip. 這樣就不需要 bash 并且可以避免 shell 引用問題。
cmd := exec.Command(
? ? "pg_dump",
? ? "--compress=9",
? ? "--file="+DbName + ".gz",
? ? "-U"+DbUserName,
? ? "-h"+DbHost,
? ? DbName,
)
log.Print("Running pg_dump...")
if err := cmd.Run(); err != nil {
? ? log.Fatal(err)
}
更簡單、更安全。
為了便于說明,這里介紹了如何在 Go 中完成這一切。
由于Cmd.Stdout
io.Reader 是一個 io.Reader ,cmd.Stdout
因此將打開的文件分配給并cmd
直接寫入它會更簡單。
// Same as above, but no --file.
cmd := exec.Command(
? ? "pg_dump",
? ? "--compress=9",
? ? "-U"+DbUserName,
? ? "-h"+DbHost,
? ? DbName,
)
// Open the output file
outfile, err := os.Create(DbName + ".gz")
if err != nil {
? ? log.Fatal(err)
}
defer outfile.Close()
// Send stdout to the outfile. cmd.Stdout will take any io.Writer.
cmd.Stdout = outfile
// Start the command
if err = cmd.Start(); err != nil {
? ? log.Fatal(err)
}
log.Print("Waiting for command to finish...")
// Wait for the command to finish.
if err = cmd.Wait(); err != nil {
? ? log.Fatal(err)
}
此外,您只檢查命令是否啟動,而不檢查命令是否成功運行。
來自 的文檔Cmd.Start
。
Start 啟動指定的命令,但不等待它完成。
命令退出后,Wait 方法將返回退出代碼并釋放相關資源。
您正在檢查cmd.Start
錯誤,但不是cmd.Wait
。檢查錯誤cmd.Start
僅意味著命令已啟動。如果程序運行時出現錯誤,您將不知道錯誤是什么。
- 2 回答
- 0 關注
- 239 瀏覽
添加回答
舉報