在go語言中,我們可以通過os/exec包中的Command和CommandContext 函數創建對應的外部程序執行Cmd對象, 這2個函數創建的cmd命令執行對象是有區別的,CommandContext創建的對象可以攜帶上下文,這個主要用于我們通過cancel函數給對應的執行程序發送強制退出命令。
下面我們使用簡單的調用系統中的ping命令來演示這2個函數的區別:
exec.Command函數創建Cmd命令對象示例
// ping命令
func TestExecPing(t *testing.T) {cmd := exec.Command("ping", "www.baidu.com")cmd.Stdout = os.Stdoutfmt.Println("將要執行的命令: ", cmd.String())cmd.Run() // 這個會一直執行,因為ping命令會一直執行
}
exec.CommandContext函數創建Cmd命令對象示例
// 帶執行上下文的ping命令
func TestExecPingWithTimeout(t *testing.T) {// 獲取一個超時上下文對象ctx,和對應的cancel函數ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)defer cancel()// 創建一個帶上下文的命令Cmd對象cmd := exec.CommandContext(ctx, "ping", "www.baidu.com")cmd.Stdout = os.Stdoutfmt.Println("將要執行的命令: ", cmd.String())cmd.Run() // 這個將在10秒鐘后 強制結束ping命令并退出}
總結
通過上面示例,我們可以清除的看出, 使用Command函數創建的ping命令會一直執行下去,除非我們手動ctrl+c 取消他, 而CommandContext函數創建的cmd對象 ,我們給ping命令傳遞了一個超時的上下文,這樣程序在指定的時間后就自動退出了。 顯然CommandContext的方式更為靈活和可控。