[go]os/exec執行shell命令

// exec基礎使用

import (
	"os/exec"
)

cmd = exec.Command("C:\\cygwin64\\bin\\bash.exe", "-c", "echo 1")
err = cmd.Run()
// 捕獲輸出

cmd = exec.Command("C:\\cygwin64\\bin\\bash.exe", "-c", "/usr/bin/python xxx.py")
output, err = cmd.CombinedOutput() // 執行了命令, 捕獲了子進程的輸出(pipe)
fmt.Println(string(output))
// 1s超時後,kill程序(強制終止/超時終止)

func main() {
	//  執行1個cmd, 讓它在一個協程裏去執行, 讓它執行2秒: sleep 2; echo hello;
	// 1秒的時候, 咱們殺死cmd
	var (
		ctx context.Context
		cancelFunc context.CancelFunc
		cmd *exec.Cmd
		resultChan chan *result
		res *result
	)

	// 建立了一個結果隊列
	resultChan = make(chan *result, 1000)

	// context:   chan byte
	// cancelFunc:  close(chan byte)

	ctx, cancelFunc = context.WithCancel(context.TODO())

	go func() {
		var (
			output []byte
			err error
		)
		cmd = exec.CommandContext(ctx, "bash", "-c", "sleep 2;echo hello;")

		// 執行任務, 捕獲輸出
		output, err = cmd.CombinedOutput()

		// 把任務輸出結果, 傳給main協程
		resultChan <- &result{
			err: err,
			output: output,
		}
	}()

	// 繼續往下走
	time.Sleep(1 * time.Second)

	// 取消上下文
	cancelFunc()

	// 在main協程裏, 等待子協程的退出,並打印任務執行結果
	res = <- resultChan

	// 打印任務執行結果
	fmt.Println(res.err, string(res.output))
}
相關文章
相關標籤/搜索