背景
为了输出执行命令的日志,主要是执行时间很长,而且分批输出日志的命令。
代码
func Execute(){command := exec.Command("执行命令")// 隐藏黑色窗口command.SysProcAttr = &syscall.SysProcAttr{CreationFlags: 0x08000000}// 输出日志OutputLog(command)
}func outputLog(cmd *exec.Cmd) string {cmd.Stdin = os.Stdinvar wg sync.WaitGroupwg.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)}
}