2017-08-20 61 views
0

我正在尝试从tmux中的运行进程建立管道,
以便逐行处理其输出。如何处理使用命名管道的过程输出

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

我一直在尝试,目前已有相当一段时间,
但仍没有得到任何值得注意的结果。

我真的很感激任何想法如何设置管道,
理想情况下,我可以在它的范围内逐行。

非常感谢

回答

0

这里是我发现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会话的输出也没有显示。我希望这可以帮助任何人