我想将'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))
}
非常感谢任何帮助。提前谢谢。
答案 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()