如何使用命名管道处理进程输出

Posted

技术标签:

【中文标题】如何使用命名管道处理进程输出【英文标题】: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。

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

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

非常感谢

【问题讨论】:

【参考方案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 会话的输出也没有显示。

希望对大家有帮助

【讨论】:

以上是关于如何使用命名管道处理进程输出的主要内容,如果未能解决你的问题,请参考以下文章

如何跨(计算)节点使用 unix 管道?

Linux进程间通信-命名管道

如何避免并行命名管道的死锁?

如何等待命名管道的另一端打开?

Linux进程间通信 -- 使用命名管道

命名管道