【问题标题】:How to execute 'top' Command output using Golang如何使用 Golang 执行“top”命令输出
【发布时间】:2017-04-14 06:45:40
【问题描述】:

我想将“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))
}

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

【问题讨论】:

    标签: go


    【解决方案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)
    

    如果您计划在批处理模式下运行 top,您可能会这样做。如果您想选择最后一个而不是捕获所有内容,请注意 tail -1 可能有价值,如果您要对特定字段进行 grep,则 fgrep 很有用 - 但不是必需的。

    供参考,这里有其他运行top的方法。

    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 服务器远程运行 top 时的常见情况)使用这个 -

    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 运行一个命令,希望与来自该服务器类型设置的远程登录进行交互,例如顶用这个:

    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()

    【讨论】:

      【解决方案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))
          }
      

      【讨论】:

      • 您好 Boris Le Méec,感谢您的回复。在 Xen Server 内部,我试图运行“xentop”命令而不是“top”命令。但是“xentop”命令没有响应。还有如何在 Go Lang 程序中运行另一个二进制文件?
      • 我不知道 Xen Server 或 xentop,但从手册页或 xentop 中,您应该使用 -b-i 作为迭代次数。如果你想在里面运行一个二进制文件,也是一样的,只要使用exec.Command(path_to_binary).Output() :)
      猜你喜欢
      • 2015-12-26
      • 2022-06-15
      • 2018-01-14
      • 1970-01-01
      • 2018-09-07
      • 2015-08-27
      • 2014-05-12
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多