私はスクリプトの長い出力を処理してデータを見つけなければなりません。このデータは、出力のほぼ初めに位置する可能性が最も高いです。データが見つかったら、出力をもう処理する必要はなく、終了することができます。開かれたパイプを閉じるためにgolangを強制する方法
exec.Cmd
には開かれたコマンドを閉じる機能がないため、出力処理を停止できないという問題があります。ここで
は、いくつかの単純化されたコード(エラーハンドリングがommitedた)次のとおりです。
func processOutput(r *bufio.Reader)(){
for {
line, _, err := r.ReadLine()
if some_condition_meet {
break
}
......
}
return
}
func execExternalCommand(){
cmdToExecute := "......"
cmd := exec.Command("bash", "-c", cmdToExecute)
output, _ := cmd.StdoutPipe()
cmd.Start()
r := bufio.NewReader(output)
go processOutput(r)
cmd.Wait()
return
}
私はcmdを停止するprocessOutput
機能で最後に何をすべきでしょうか?多分それを解決する別の方法があります。
おかげ
「開かれたコマンドを閉じる」方法はありません。プロセスを終了させるには、 'Kill'メソッドまたは' Signal'メソッドで行うことができます。 – JimB
コマンドがstdinを読み取り、EOFで終了した場合は、stdinをコマンドに閉じます。それ以外の場合は、他のコメントに記載されているように信号を送信してください。 –
少し詳細を追加するだけで、stdinを閉じると、サブプロセスのstdoutはSIGPIPEシグナルを受け取るようになります(この動作がオーバーライドされない限り、デフォルトで)。だからあなたは、ある方法や別の方法で信号を送信しています。 –