go - 如何强制golang关闭打开的管道

标签 go pipe

我必须处理脚本的长输出并找到一些数据。该数据很可能位于输出的几乎最开始处。找到数据后,我不再需要处理输出,可以退出。

由于 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/

相关文章:

mongodb - Mongodb 和 Go - 使用动态数据模型

linux - 使用 tee 将输入管道输入到两个进程替换

c - 管道系统调用

c# - 建立连接后需要调用DisposeLocalCopyOfClientHandle()

go - 结构中的私有(private)/公共(public)领域..表现不同

go - 加朗 : type interface {} does not support indexing

go - 在同一个共享 channel 上并发选择

amazon-web-services - 如何启用认知用户 MFA

gzip - mysqldump 管道 gzip 速度差异

c - 在启用换行的情况下将终端光标返回到行首