如何使用Golang执行'top'命令输出

时间:2016-11-17 12:39:16

标签: go

我想将'top'命令的输出写入另一个文件。但是当我使用下面的代码尝试它时,我收到以下错误:

'退出状态1'。

这是我的代码:

package main

import "os/exec"

func main() {
    app := "top"
    cmd := exec.Command(app)
    stdout, err := cmd.Output()

    if err != nil {
        println(err.Error())
        return
    }

    print(string(stdout))
}

非常感谢任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:2)

从“top”的手册页,-b选项适合将输出发送到另一个程序(没有颜色,没有任何东西)作为纯文本,-n是它在停止之前迭代的帧数。如果没有-n,它将迭代无限时间。

 func main() {
      app := "top"
      arg0 := "-b"
      arg1 := "-n"
      arg2 := "1"

      cmd := exec.Command(app, arg0, arg1, arg2)
      stdout, err := cmd.Output()

      if err != nil {
        println(err.Error())
        return
      }

      print(string(stdout))
    }

答案 1 :(得分:1)

s := fmt.Sprintf(`"top -bn2 | fgrep 'Cpu(s)' | tail -1"`, host)
log.Printf("top = %s\n", s)
cmd := exec.Command("bash", "-c", s)
b, e := cmd.Output()
if e != nil {
    log.Printf("failed due to :%v\n", e)
    panic(e)
}
log.Printf("%v\n", string(b))
raw := string(b)

如果您计划在批处理模式下运行,则可能会执行此操作。注意tail -1可能有价值,如果你想选择最后一个而不是捕获所有内容,而fgrep对于特定字段的grep是有用的 - 但是没有必要。

作为参考,以下是其他运行顶部的方法。

c := exec.Command("top")
c.Stdin = os.Stdin
c.Stdout = os.Stdout
c.Stderr = os.Stderr
c.Run()

这是本地的。如果您通过ssh查看,请使用此 -

c := exec.Command("ssh", "-t", "localhost", "top")
c.Stdin = os.Stdin
c.Stdout = os.Stdout
c.Stderr = os.Stderr
c.Run()

如果你想启动服务器,并通过telnet作为客户端连接并在telnet屏幕上显示top命令的结果(使用go introspecting服务器远程运行顶级时的常见情况)请使用此 -



    func main() {
        l, _ := net.Listen("tcp", "127.0.0.1:12345")
        for {
            c, _ := l.Accept()
            go func() {
                handle(&c)
            }()
        }
    }
    func handle(c *net.Conn) {
        cmd := exec.Command("top")
        cstdout, _ := cmd.StdoutPipe()
        go io.Copy(bufio.NewWriter(*c), bufio.NewReader(cstdout))
        cmd.Run()
    }


如果您使用telnet和ssh构建终端以运行app之类的通用命令,请使用此库 - https://github.com/kr/pty

编辑为了让它变得更好......这是一个适用于PTY的示例,方案是如果您使用ssh -t运行命令,希望与此服务器类型设置中的telneting进行交互,例如顶部用这个:



       cmd := exec.Command("ssh", "-t", "localhost", "top")
        f, _ := pty.Start(cmd)
        go io.Copy(bufio.NewWriter(*c), f)
        go io.Copy(f, bufio.NewReader(*c))
        go io.Copy(bufio.NewWriter(*c), os.Stdin)
        cmd.Run()