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 关注
- 189 浏览
添加回答
举报