嗨大家因为某些原因等待()当我执行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()返回,即使已完成也只是冻结。
答案 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>