将 exec.CommandContext 与 sg_inq 系统命令一起使用并且从不超时 returns

Using exec.CommandContext with sg_inq sys comand and timeout never returns

我正在尝试在多路径设备 (/dev/mapper/mpatha) 上调用 sg_inq。 sg_inq 向特定设备发送 iScsi 查询并提取一些数据。我使用 go 自己的 exec.commandContext 作为超时时间,像这样:

ctx, cancel := context.WithTimeout(context.Background(), 
time.Duration(1000)*time.Millisecond)
defer cancel()

cmd := exec.CommandContext(ctx, "sg_inq", "/dev/mapper/mpatha")
err := cmd.Run()
cmd.Stdout = &stdout
cmd.Stderr = &stderr
stdErr := stderr.Bytes()
stdOut := stdout.Bytes()

官方指南中的代码参考 - https://golang.org/pkg/os/exec/#CommandContext

此代码永远不会 return。 当我 运行 它作为一个独立的脚本时,它工作正常。但是我 运行 它作为整个界面的一部分,它只是卡住了。我可以看到所有呼叫 "out",但其中 none 个 return。

为什么相同的代码片段可以在独立脚本中运行但不能在整个过程中运行 class?或者也许我离这里很远,问题完全是另一回事? 我在 go 1.9.2(最新)上编译它,但我也在 1.9.1 上试过。

构建工作正常,测试通过,因此一切正常。

实际上解决方案非常简单。 主要问题是系统调用并不总是正常运行。我使用这些 links:

对此进行了研究

http://www.darrencoxall.com/golang/executing-commands-in-go/
https://github.com/ryankurte/go-async-cmd/blob/master/cmd.go

我发现读取命令输出的唯一位置是在 cmd.Wait() 之前和 cmd.Start() 之后。这就是为什么我一直得到一个空字节数组。 代码做了 return,它只是空的。

我发现更多 - https://medium.com/@vCabbage/go-timeout-commands-with-os-exec-commandcontext-ba0c861ed738

最后一个 link 对我遇到的问题有一个 惊人的 解决方案。根本不使用 cmd.Wait()。