2016-11-17 386 views
1

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

'退出状态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

在“top”的手册页中,-b选项适用于将输出作为纯文本发送到另一个程序(无颜色,无任何内容),-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)) 
    } 
+0

嗨鲍里斯勒米埃克,感谢您的答复。在Xen Server内部,我试图运行'xentop'命令而不是'top'命令。但是对'xentop'命令没有回应。另外如何运行Go Lang程序中的另一个二进制文件? –

+0

我不知道Xen Server或者xentop,但是从手册页或者'xentop',你应该使用'-b'和'-i'作为迭代次数。 如果你想在里面运行一个二进制文件,它是一样的,只需使用'exec.Command(path_to_binary).Output()':) –

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) 

这就是你可能会做,如果你打算在批处理模式上运行。如果你想选择最后一个,而不是捕获所有内容,注意尾部-1也许是有价值的,而如果你要为特定的字段grep,fgrep会很有用 - 但是这不是必须的。

仅供参考,以下是运行top的其他方法。

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

这是为本地。如果要启动服务器

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

,并连接为通过Telnet客户端和顶部远程运行使用,当在上面的命令远程登录屏幕结果显示(常见的情况 - 如果您通过SSH看,使用这个去反思服务器可能)使用此 -

 


    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运行像应用通用命令使用这个库建设终端 - 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()