duanlv5084 2016-05-22 21:41
浏览 7
已采纳

转至:从顶部将内容添加到输出

In my go program, I need to run top to continuously monitoring a specific process. But top does not give me the timestamp when each line is recorded. I'm thinking about prepending it to the outputs my self:

top := exec.Command("top", "-p", pid)
r, w := os.Pipe()
top.Stdout = w
top.Start()

This way I can read the outputs from r at one end of the pipe. I wonder how can I fire an action to get the current timestamp and prepend it to the output whenever there's a new line from top.Stdout? I think it should be like a callback or Python's generator, but I'm not sure how to do it in Go.

  • 写回答

1条回答 默认 最新

  • douxunnian0423 2016-05-22 22:13
    关注

    Something along the lines of:

    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
    }
    

    The channel usage is just an example, you can just return the rwader from the pipe directly.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题