去exec.Command(...).Wait()永远挂起

时间:2016-11-19 19:38:38

标签: go

嗨大家因为某些原因等待()当我执行mysql命令时永远挂起,有谁知道为什么? 这是我的代码。

// Import imports data into Local database
func (x MySQL) Import(data string, opt LocalDb) {
    var stderr bytes.Buffer
    cmd := exec.Command("mysql", x.importOptions(opt)...)
    // Set < pipe variable
    stdin, err := cmd.StdinPipe()
    errChk(err)

    cmd.Stderr = &stderr
    cmd.Start()

    // Write data to pipe
    io.WriteString(stdin, data)
    fmt.Println("Importing " + x.DB + " to localhost...")

    // Log mysql error
    if err := cmd.Wait(); err != nil {
        log.Fatal(stderr.String())
    } else {
        fmt.Println("Importing complete")
    }
}

此函数完成所有操作,mysql将数据导入数据库,但它永远不会从Wait()返回,即使已完成也只是冻结。

1 个答案:

答案 0 :(得分:3)

问题是您尚未关闭stdin管道。 MySQL将一直保持活动状态。

修复很简单:

// Write data to pipe
io.WriteString(stdin, data)
stdin.Close()
fmt.Println("Importing " + x.DB + " to localhost...")

StdinPipe()以这种方式行事的事实记录如下:

  

StdinPipe返回一个管道,该命令将在命令启动时连接到命令的标准输入。 在Wait看到命令退出后,管道将自动关闭。调用者只需要调用Close来强制管道更快关闭。例如,如果正在运行的命令在标准输入关闭之前不会退出,则调用者必须关闭管道。 / p>