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