我必须处理脚本的长输出并找到一些数据。该数据很可能位于输出的几乎最开始处。找到数据后,我不再需要处理输出,可以退出。
由于 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?也许还有另一种方法可以解决这个问题。
谢谢
最佳答案
就目前情况而言,您无法从 processOutput
执行此操作,因为它接收的只是 bufio.Reader
。您需要将 exec.Cmd 传递给它,以便它对 fork 进程执行任何操作。
要终止 fork 进程,您可以向其发送信号,例如:cmd.Process.Kill()
或 cmd.Process.Signal(os.SIGINT)
。请参阅有关 exec.Cmd
的文档和 os.Process
.
关于go - 如何强制golang关闭打开的管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45922528/