代码之家  ›  专栏  ›  技术社区  ›  TzurEl

使用exec。带有sg\U inq sys comand和timeout的CommandContext从不返回

  •  0
  • TzurEl  · 技术社区  · 7 年前

    我正在尝试在多路径设备(/dev/mapper/mpatha)上调用sg\u inq。 sg\U 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

    此代码永远不会返回。 当我将其作为独立脚本运行时,它运行得很好。但当我把它作为整个界面的一部分运行时,它就卡住了。我可以看到所有的呼叫都“发出”,但没有一个返回。

    为什么同一个代码段在独立脚本中有效,但在整个go类中无效?或者我离这里太远了,问题完全是别的? 我正在go 1.9.2(最新版本)上编译它,但我也尝试了1.9.1。

    构建工作正常,测试通过,所以一切都应该正常。

    1 回复  |  直到 7 年前
        1
  •  0
  •   TzurEl    7 年前

    实际上,解决方案相当简单。 主要问题是systemcall并不总是正常工作。我通过以下链接对此进行了研究:

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

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

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

    最后一个链接具有 太神了 我遇到的问题的解决方案。不使用cmd。等等()。