【问题标题】:how to handle process output in go using named pipe如何使用命名管道处理进程输出
【发布时间】:2017-08-20 11:28:37
【问题描述】:

我正在尝试从 tmux 中正在运行的进程设置管道,
为了逐行处理其输出。

我看过this guide to pipe the output of a tmux session to stdout
this article about (named) pipes in go

我已经尝试了很长时间了,
但仍然没有得到任何值得注意的结果。

我真的很感激任何关于如何设置管道的想法,
理想情况下,我可以逐行覆盖它。

非常感谢

【问题讨论】:

    标签: go named-pipes tmux mkfifo


    【解决方案1】:

    这是我找到的解决方案here(谢谢Malcolm

    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 会话的输出也没有显示。

    希望对大家有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 2019-06-10
      • 2014-07-26
      • 2015-11-16
      • 2012-08-30
      • 2012-03-10
      • 1970-01-01
      相关资源
      最近更新 更多