Bagaimana untuk Menstrim Output Perintah dalam Masa Nyata Menggunakan Go?

Mary-Kate Olsen
Lepaskan: 2024-11-22 00:04:17
asal
897 orang telah melayarinya

How to Stream Command Output in Real-Time Using Go?

Streaming Command Output Dalam Talian

Pertimbangkan kod berikut yang melaksanakan arahan dan menangkap outputnya:

cmdParams := [][]string{
    {filepath.Join(dir, path), "npm", "install"},
    {filepath.Join(pdir, n.path), "gulp"},
}
for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]
    // Wait to finish, get output:
    out, err := cmd.Output()
    if err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Println("Finished %s, output: %s", cp[1:], out)
}
Salin selepas log masuk

Kod ini menangkap output lengkap arahan dan mencetaknya hanya selepas arahan selesai perlaksanaan. Walau bagaimanapun, terdapat keperluan untuk menstrim output dalam masa nyata.

Untuk mencapai penstriman output langsung, kami boleh mengubah suai kod seperti berikut:

cmdParams := [][]string{
    {filepath.Join(dir, path), "npm", "install"},
    {filepath.Join(pdir, n.path), "gulp"},
}
for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]

    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Printf("%s cmd.StdoutPipe() error: %v\n", cp[1:], err)
        return
    }
    // Start command:
    if err = cmd.Start(); err != nil {
        log.Printf("%s start error: %v\n", cp[1:], err)
        return
    }

    // Stream command output:
    scanner := bufio.NewScanner(stdout)
    scanner.Split(bufio.ScanRunes)
    for scanner.Scan() {
        fmt.Print(scanner.Text())
    }
    if scanner.Err() != nil {
        log.Printf("Reading %s stdout error: %v\n", cp[1:], err)
        return
    }

    // Get execution success or failure:
    if err = cmd.Wait(); err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Printf("Finished %s", cp[1:])
}
Salin selepas log masuk

Berikut ialah penjelasan tentang perubahan :

  • cmd.StdoutPipe() mencipta paip untuk membaca standard arahan output.
  • cmd.Start() memulakan arahan di latar belakang.
  • bufio.NewScanner(stdout) mencipta pengimbas untuk membaca daripada paip stdout.
  • pengimbas. Split(bufio.ScanRunes) menetapkan pengimbas untuk dibaca dengan rune, menyediakan secara langsung penstriman.
  • Gelung Imbas() pengimbas secara berterusan membaca dan mencetak setiap rune (watak) yang dihasilkan oleh arahan.
  • Selepas gelung selesai (penulisan arahan ke stdout telah selesai), pengimbas. Err() menyemak sebarang ralat.
  • cmd.Wait() menunggu arahan selesai dan menyemak ralat.
  • Pernyataan log.Println() terakhir merekodkan penyempurnaan arahan.

Atas ialah kandungan terperinci Bagaimana untuk Menstrim Output Perintah dalam Masa Nyata Menggunakan Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan