Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mendapatkan Output Masa Nyata daripada Perintah Shell dalam Go?

Bagaimana untuk Mendapatkan Output Masa Nyata daripada Perintah Shell dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-12-08 18:51:15481semak imbas

How to Get Realtime Output from Shell Commands in Go?

Cara Mendapatkan Keluaran Masa Nyata untuk Perintah Shell dalam Go

Masalah:

Apabila melaksanakan arahan shell yang berjalan lama dalam Go menggunakan os/exec, bagaimana anda boleh mendapatkan semula output masa nyata dan memprosesnya apabila ia menjadi tersedia?

Penyelesaian:

  1. Gunakan stderr Daripada stdout:

    ffmpeg diketahui keluarkan mesej diagnostik kepada stderr dan bukannya stdout. Oleh itu, sambungkan kepada stderr apabila mencipta objek arahan dan bukannya stdout.

  2. Baca Output daripada stderr Secara Berterusan:

    Buat bufio.Pengimbas untuk stderr dan gunakan kaedah Imbas untuk membaca baris keluaran demi baris atau perkataan demi perkataan.

  3. Kendalikan Output Baris demi Baris:

    Dalam kod contoh, pengimbas.Split(bufio.ScanWords) digunakan untuk memisahkan output pada ruang. Laraskan jenis pemisahan berdasarkan keperluan pemprosesan anda.

  4. Output Proses:

    Memanipulasi output mengikut cara yang anda inginkan, seperti mengekstrak dan memproses maklumat kemajuan.

Contoh Kod:

package main

import (
    "bufio"
    "fmt"
    "os/exec"
    "strings"
)

func main() {
    args := "-i test.mp4 -acodec copy -vcodec copy -f flv rtmp://aaa/bbb"
    cmd := exec.Command("ffmpeg", strings.Split(args, " ")...)

    stderr, _ := cmd.StderrPipe()
    cmd.Start()

    scanner := bufio.NewScanner(stderr)
    scanner.Split(bufio.ScanWords)
    for scanner.Scan() {
        m := scanner.Text()
        fmt.Println(m)
    }
    cmd.Wait()
}

Output:

Kod akan terus mencetak mesej output ffmpeg, seperti:

frame=  101 fps=0.0 q=28.0 size=      91kB time=00:00:04.13 bitrate= 181.2kbits/s

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

Kenyataan:
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