我一直在尝试pg_restore使用数据库转储文件中的数据 来调用exec.Command和提供数据,它适用于 1Mb 以下的小文件,但对于较大的转储,它会因错误而失败。我还尝试逐行扫描并写入管道,但它导致了相同的错误,并且像在单独的 goroutine 中一样运行也无济于事。StdinPipewrite |1: broken pipecmd.Run()去:1.14 操作系统:macOScmd := exec.Command("pg_restore", "--clean", "-n public", "--dbname=DB_URI")cmd.Stdout = os.Stdoutcmd.Stderr = os.Stderrpw, err := cmd.StdinPipe()defer pw.Close()...done := make(chan struct{})errCh := make(chan error)file, err := os.Open("dumpfile")defer file.Close()if err := cmd.Start(); err != nil { return err}_, err = io.Copy(pw, file)我做错了什么或如何保持管道畅通?
3 回答

RISEBY
TA贡献1856条经验 获得超5个赞
使用cat
代替时pg_restore
,您的代码有效。另一方面,
在使用时,我遇到了与您相同的错误,这实际上是预期的。head -10
由于您是cmd
在异步模式下启动的,因此如果pg_restore
在使用它的所有之前停止,如果它尝试在封闭的管道上写入STDIN
,io.Copy
则会遇到这种错误。
检查您的pg_restore
命令的状态(最终返回码、打印在其 STDERR 上的内容、日志...)以查看是否存在实际错误。
您可以将此错误视为您不应再向此命令提供输入的正常指示。

一只甜甜圈
TA贡献1836条经验 获得超5个赞
在我同事的帮助下,我们发现命令参数格式错误,因为 Go 直接使用系统调用,程序的每个参数都必须是单独的,所以这 -n public
导致了问题
"pg_restore", "--clean", "-n public", "--dbname=DB_URI"
并且修复也很清楚 - 拆分它们-n
,public
"pg_restore", "--clean", "-n", "public", "--dbname=DB_URI"
- 3 回答
- 0 关注
- 158 浏览
添加回答
举报
0/150
提交
取消