我必須處理腳本的長輸出並找到一些數據。這些數據很可能位於輸出的最開始處。數據發現後,我不需要處理輸出,可以退出。如何強制golang關閉打開的管道
由於exec.Cmd
沒有關閉打開的命令的功能,所以無法停止處理輸出的問題。
這裏有一些簡單的代碼(錯誤處理是中省略):
func processOutput(r *bufio.Reader)(){
for {
line, _, err := r.ReadLine()
if some_condition_meet {
break
}
......
}
return
}
func execExternalCommand(){
cmdToExecute := "......"
cmd := exec.Command("bash", "-c", cmdToExecute)
output, _ := cmd.StdoutPipe()
cmd.Start()
r := bufio.NewReader(output)
go processOutput(r)
cmd.Wait()
return
}
我目前應該做到底在processOutput
功能停止在cmd?也許有另一種方法來解決它。
感謝
你是什麼意思,沒有辦法「關閉打開的命令」?你可以通過發送一個信號退出來終止一個進程,你可以通過'Kill'或'Signal'方法來完成這個過程。 – JimB
如果該命令讀取stdin並在EOF上退出,則關閉stdin至該命令。否則,發送其他評論中提到的信號。 –
只需添加更多細節,如果關閉stdin,那麼子進程的stdout寫入將導致它接收到一個SIGPIPE信號(默認情況下,除非這種行爲被覆蓋)。所以你發送信號的方式是這樣或那樣。 –