为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
largeQ 2022-01-10 18:51:34
在我的 Go 程序中,我需要运行top以持续监控特定进程。但是top没有给我记录每一行的时间戳。我正在考虑将其添加到我自己的输出中:top := exec.Command("top", "-p", pid)r, w := os.Pipe()top.Stdout = wtop.Start()这样我就可以从r管道的一端读取输出。我想知道如何触发一个动作来获取当前时间戳并将其添加到输出中,只要有新行来自top.Stdout?我认为它应该像一个回调或 Python 的生成器,但我不确定如何在 Go 中做到这一点。
查看完整描述

1 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

类似于以下内容:


func main() {

    for ln := range topMon(2543) {

        fmt.Println(time.Now().UTC().Format(time.RFC3339), ln)

    }

}


func topMon(pids ...int) <-chan string {

    ch := make(chan string, 1)

    top := exec.Command("top", "-b")

    for _, pid := range pids {

        top.Args = append(top.Args, "-p", strconv.Itoa(pid))

    }

    r, w, _ := os.Pipe()

    go func() {

        sc := bufio.NewScanner(r)

        for sc.Scan() {

            ch <- sc.Text()

        }

        close(ch)

    }()

    top.Stdout = w

    top.Stderr = os.Stderr

    if err := top.Start(); err != nil {

        panic(err)

    }

    return ch

}

通道使用只是一个示例,您可以直接从管道中返回 rwader。


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信