2017-10-30 4 views
0

ノードをブートストラップするには、Golangコードでknife bootstrapコマンドを使用しています。いくつかの時間はレシピで待っており、それは10分以上待つ。そのような場合、私はエラー "エラー:IOStreamクローズ"を取得しています。時間制限を増やす方法はありますか?また、私はcmdの出力とエラーストリームからログを読んでいます。Golangスキャン機能で「ERROR:IOError:closed stream」を処理する方法は?

func executeCMDWorkstation(cmd *exec.Cmd, projectId, cr_id string) bool { 

stdout, err3 := cmd.StdoutPipe() 
if err3 != nil { 
    utils.Info.Println(err3) 
    return false 
} 
defer stdout.Close() 
stderr, err4 := cmd.StderrPipe() 
if err4 != nil { 
    utils.Info.Println(err4) 
    return false 
} 
defer stderr.Close() 

//cmd.Stdout = os.Stdout 
//cmd.Stderr = os.Stderr 
multi := io.MultiReader(stdout, stderr) 
inp := bufio.NewScanner(multi) 
err := cmd.Start() 
if err != nil { 
    utils.Info.Println("Error while creating client", err) 
    return false 
} 
fmt.Println("Generating logs**************") 
for inp.Scan() { 

    line := inp.Text() 
    if cr_id == "" { 
     lg.SendDebugLogs(line, "projects/logs", projectId, "chef") 
    } else { 
     lg.SendDebugLogs(line, "changeRequests/logs", cr_id, "chef") 
    } 
} 
exitStatus := cmd.Wait() 
if exiterr, ok := exitStatus.(*exec.ExitError); ok { 
    utils.Info.Println("************ Exit Status is:", exiterr, "************") 
    return false 
} 

return true 

このプロセスを改善するための助けがあれば幸いです。

答えて

0

いくつかのフォーラム、Go Docsを見て、いくつかのコードを変更して、最後にbufioのスキャンメソッドをtextprotoのReadLineに置き換えてみました。

私は、次のコードに置き換え:次のコードで

inp := bufio.NewScanner(multi) 
err := cmd.Start() 
if err != nil { 
    utils.Info.Println("Error while creating client", err) 
    return false 
} 
fmt.Println("Generating logs**************") 
for inp.Scan() { 
    line := inp.Text() 
    if cr_id == "" { 
     lg.SendDebugLogs(line, "projects/logs", projectId, "chef") 
    } else { 
     lg.SendDebugLogs(line, "changeRequests/logs", cr_id, "chef") 
    } 
} 

を:最後に

inp1 := bufio.NewReader(multi) 

    tp := textproto.NewReader(inp1) 

    err := cmd.Start() 
    if err != nil { 
     utils.Info.Println("Error while creating client", err) 
     return false 
    } 
    fmt.Println("Generating logs**************") 

    /* 
    New code for logs starts here 
    */ 


    for { 
     line, readErr := tp.ReadLine() 

     if readErr != nil { 
       break 
     } 

     if cr_id == "" { 
      lg.SendDebugLogs(line, "projects/logs", projectId, "chef") 
     } else { 
      lg.SendDebugLogs(line, "changeRequests/logs", cr_id, "chef") 
     } 
    } 

、この変更はすぐに再起動するだけでなく、長いスリープ/待機を処理することにより、私のために完璧にうまく働きましたシェフのレシピまたはスクリプトで。基本的にストリームリーダーを変更しました。同じ問題に直面している他の誰かに役立つことを願っています:)

関連する問題