Go:将内容添加到顶部的输出中

在我的 Go 程序中,我需要运行top以持续监控特定进程。但是top没有给我记录每一行的时间戳。我正在考虑将其添加到我自己的输出中:


top := exec.Command("top", "-p", pid)

r, w := os.Pipe()

top.Stdout = w

top.Start()

这样我就可以从r管道的一端读取输出。我想知道如何触发一个动作来获取当前时间戳并将其添加到输出中,只要有新行来自top.Stdout?我认为它应该像一个回调或 Python 的生成器,但我不确定如何在 Go 中做到这一点。


largeQ
浏览 150回答 1
1回答

至尊宝的传说

类似于以下内容:func main() {&nbsp; &nbsp; for ln := range topMon(2543) {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(time.Now().UTC().Format(time.RFC3339), ln)&nbsp; &nbsp; }}func topMon(pids ...int) <-chan string {&nbsp; &nbsp; ch := make(chan string, 1)&nbsp; &nbsp; top := exec.Command("top", "-b")&nbsp; &nbsp; for _, pid := range pids {&nbsp; &nbsp; &nbsp; &nbsp; top.Args = append(top.Args, "-p", strconv.Itoa(pid))&nbsp; &nbsp; }&nbsp; &nbsp; r, w, _ := os.Pipe()&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; sc := bufio.NewScanner(r)&nbsp; &nbsp; &nbsp; &nbsp; for sc.Scan() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ch <- sc.Text()&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; close(ch)&nbsp; &nbsp; }()&nbsp; &nbsp; top.Stdout = w&nbsp; &nbsp; top.Stderr = os.Stderr&nbsp; &nbsp; if err := top.Start(); err != nil {&nbsp; &nbsp; &nbsp; &nbsp; panic(err)&nbsp; &nbsp; }&nbsp; &nbsp; return ch}通道使用只是一个示例,您可以直接从管道中返回 rwader。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go