我一直在嘗試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 關注
- 151 瀏覽
添加回答
舉報
0/150
提交
取消