2016-11-19 18 views
0

何人かの人がいますか?mysqlコマンドを実行すると待機します。 ここに私のコードです。exec.Command(...)に移動します。wait()が永久にハングします

// 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を削除しても変更されません。 –

答えて

1

問題は、stdinパイプを閉じていないことです。 MySQLはそれまで有効です。

修正が簡素である。このようにStdinPipe()行為はように文書化されていることを

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

事実:

StdinPipeは、コマンドの標準入力に接続されるパイプを返しますコマンドが開始されます。 Waitがコマンドの終了を確認した後、パイプは自動的に閉じられます。呼び出し側は、Closeを呼び出すだけで、パイプをすぐに閉じることができます。たとえば、実行中のコマンドが標準入力が閉じられるまで終了しない場合、呼び出し側はパイプを閉じる必要があります。

関連する問題