执行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的数据导入到数据库中,但它从来没有从等待返回()只是冻结存在,即使已经完成。
答
问题是你还没有关闭stdin
管道。 MySQL将保持活动状态,直到它。
修复的方法是这样的简单:
// Write data to pipe
io.WriteString(stdin, data)
stdin.Close()
fmt.Println("Importing " + x.DB + " to localhost...")
该StdinPipe()
行为以这种方式记录为这样的事实:
StdinPipe返回将被连接到该命令的标准输入时的管该命令开始。 在Wait看到命令退出后,管道将自动关闭。呼叫者只需调用Close即可更快地关闭管道。例如,如果正在运行的命令在标准输入关闭之前不会退出,调用者必须关闭管道。
当您删除行'cmd.Stderr =&stderr'时,它仍然挂起吗? –
mysql等待更多输入。 – tkausl
如果我删除cmd.Stderr它不会更改。 –