Dalam senario di mana arahan jangka panjang dilaksanakan dan outputnya perlu terus disalurkan ke proses induk dan ke fail log , kaedah cmd.StdoutPipe() boleh digunakan untuk menangkap output.
cmd := exec.Command("sh", "-c", "some long runnig task") stdout, _ := cmd.StdoutPipe() cmd.Start() scanner := bufio.NewScanner(stdout) for scanner.Scan() { m := scanner.Text() fmt.Println(m) log.Printf(m) } cmd.Wait()
Walau bagaimanapun, pendekatan ini hanya menyediakan output akhir sebagai rentetan tunggal, bukan menstrimkan hasil separa.
Bufio.NewScanner () fungsi beroperasi pada baris, mengembalikan baris lengkap apabila aksara baris baharu ditemui. Jika arahan yang dilaksanakan tidak menghasilkan aksara baris baharu, output tidak akan distrim serta-merta.
Untuk menangani had ini, terdapat beberapa pendekatan yang perlu dipertimbangkan:
Membaca dengan Perkataan atau Aksara:
Dengan menetapkan fungsi split menggunakan Scanner.Split(), anda boleh mengimbas input dengan perkataan atau aksara, menangkap output semasa ia dihasilkan.
scanner := bufio.NewScanner(stdout) scanner.Split(bufio.ScanRunes)
Bacaan Manual:
Membaca bait demi bait atau rune-by-rune membolehkan anda tangkap output semasa ia dijana, tanpa bergantung pada aksara baris baharu.
oneByte := make([]byte, 1) for { _, err := stdout.Read(oneByte) if err != nil { break } fmt.Printf("%c", oneByte[0]) } oneRune := make([]byte, utf8.UTFMax) for { count, err := stdout.Read(oneRune) if err != nil { break } fmt.Printf("%s", oneRune[:count]) }
Adalah penting untuk mengurus saiz penimbal untuk output standard dan aliran ralat dalam kanak-kanak proses. Secara lalai, jika penimbal ini tidak dibaca, ia boleh menyebabkan proses kanak-kanak digantung. Oleh itu, adalah disyorkan untuk sentiasa membaca kedua-dua strim stdout dan stderr.
Atas ialah kandungan terperinci Bagaimana untuk Menstrim Output Separa daripada Perintah Jangka Panjang dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!