2016-11-17 77 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()