执行exec.Command(...)。等待()挂起永远

问题描述:

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

// 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的数据导入到数据库中,但它从来没有从等待返回()只是冻结存在,即使已经完成。

+0

当您删除行'cmd.Stderr =&stderr'时,它仍然挂起吗? –

+4

mysql等待更多输入。 – tkausl

+0

如果我删除cmd.Stderr它不会更改。 –

问题是你还没有关闭stdin管道。 MySQL将保持活动状态,直到它。

修复的方法是这样的简单:

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

StdinPipe()行为以这种方式记录为这样的事实:

StdinPipe返回将被连接到该命令的标准输入时的管该命令开始。 在Wait看到命令退出后,管道将自动关闭。呼叫者只需调用Close即可更快地关闭管道。例如,如果正在运行的命令在标准输入关闭之前不会退出,调用者必须关闭管道。