【Golang】exec.command命令日志输出示例

背景

为了输出执行命令的日志,主要是执行时间很长,而且分批输出日志的命令。

代码

func Execute(){
	command := exec.Command("执行命令")
    // 隐藏黑色窗口
	command.SysProcAttr = &syscall.SysProcAttr{CreationFlags: 0x08000000}
	// 输出日志
    OutputLog(command)
}


func outputLog(cmd *exec.Cmd) string {
	cmd.Stdin = os.Stdin

	var wg sync.WaitGroup
	wg.Add(2)
	//捕获标准输出
	stdout, err := cmd.StdoutPipe()
	if err != nil {
		log.Error("INFO:", err)
		os.Exit(1)
	}
	readOut := bufio.NewReader(stdout)
	go func() {
		defer wg.Done()
		getOutput(readOut)
	}()

	//捕获标准错误
	stderr, err := cmd.StderrPipe()
	if err != nil {
		log.Error("ERROR:", err)
		os.Exit(1)
	}
	readErr := bufio.NewReader(stderr)
	go func() {
		defer wg.Done()
		getOutput(readErr)
	}()

	//执行命令
	err = cmd.Run()
	if err != nil {
		return ""
	}
	wg.Wait()
}

func getOutput(reader *bufio.Reader) string {
	outputBytes := make([]byte, 200)
	for {
		n, err := reader.Read(outputBytes)
		if err != nil {
			if err == io.EOF {
				break
			}
		    //输出屏幕内容
			log.Error(err)
		}
		output := string(outputBytes[:n])
		//输出屏幕内容
		log.Info(output)
	}
}

你可能感兴趣的:(go,golang,开发语言,后端)