как обрабатывать вывод процесса в go с использованием именованного канала


person Hendrik Evert    schedule 20.08.2017    source источник


Ответы (1)


Вот решение, которое я нашел здесь (спасибо Малкольм)

func Readln(r *bufio.Reader) (string, error) {
    var (
        isPrefix = true
        err      error
        line, ln []byte
    )
    for isPrefix && err == nil {
        line, isPrefix, err = r.ReadLine()
        ln = append(ln, line...)
    }
    return string(ln), err
}

func handle(s string) {
    //Do something with your string
}

func main() {
    c := exec.Command("sh", "./tmuxpipe.sh")
    err := c.Run()
    if err != nil {
        log.Fatal(err)
    }

    f, err := os.Open("/tmp/tmuxpipe")
    if err != nil {
        fmt.Printf("error opening file: %v\n", err)
        os.Exit(1)
    }
    r := bufio.NewReader(f)
    s, e := Readln(r)
    for e == nil {
        handle(s)
        log.Println(s)
        s, e = Readln(r)
    }
}

вот tmuxpipe.sh:

mkfifo /tmp/tmuxpipe
tmux pipe-pane -o -t tmuxSession 'cat >> /tmp/tmuxpipe'

Причина, по которой я не просто использовал там exec.Command(), заключается в том, что по какой-то причине вне моего понимания это:

c := exec.Command("tmux", "pipe-pane", "-o", "-t", "tmuxSession", 'cat >> /tmp/tmuxpipe'") 
err := c.Run()
handleError(err)

не сработало (у меня). Ошибки не было, но вывод сеанса tmux также не отображался.

Я надеюсь, что это поможет кому-нибудь

person Hendrik Evert    schedule 20.08.2017