1 回答

TA貢獻1842條經驗 獲得超21個贊
您沒有在多個地方檢查錯誤。
在某些情況下,這實際上并沒有引起問題,但檢查一下仍然是個好主意:
cmd.Start()
可能會返回錯誤,在這種情況下該命令從未運行過。(這不是實際問題。)
stdoutScanner.Scan()返回 false 時,可能stdoutScanner.Err()會顯示錯誤。如果你開始檢查這個,你會發現一些錯誤:
2020/02/19 15:38:17 [stdout err] read |0: file already closed
這不是真正的問題,但是——啊哈——這與您看到的癥狀相符:并非所有輸出都被看到?,F在,為什么閱讀會stdout聲稱文件已關閉?嗯,stdout從哪里來的?它來自這里:
stdout, err := cmd.StdoutPipe()
看看這個函數的源代碼,它以以下幾行結尾:
c.closeAfterStart = append(c.closeAfterStart, pw)
c.closeAfterWait = append(c.closeAfterWait, pr)
return pr, nil
(并且pr是管道讀取的返回值)。嗯:什么closeAfterWait意思?
現在,這是循環中的最后兩行:
cmd.Wait()
wg.Wait()
也就是說,首先我們等待cmd完成。(cmd完成后,什么會關閉?)然后我們等待正在讀取cmd標準輸出的 goroutine 完成。(嗯,還有什么可以從pr管道中讀取?)
修復現在很明顯:將wg.Wait()等待 stdout 管道的使用者完成讀取它的 與cmd.Wait()等待echo ...退出然后關閉管道的讀取端的 交換。如果您在讀者仍在閱讀時關閉,他們可能永遠不會閱讀您所期望的內容。
- 1 回答
- 0 關注
- 107 瀏覽
添加回答
舉報