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

背景

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

代码

Go 复制代码
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)
	}
}
相关推荐
普通网友4 分钟前
JavaScript:ESLint+Prettier 规范代码格式
开发语言·javascript·ecmascript
t***5445 分钟前
如何在 Dev-C++ 中切换编译器
java·开发语言·c++
Lisonseekpan7 分钟前
Git:如何将一个分支的特定提交合并到另一个分支?
java·大数据·git·后端·elasticsearch
jiayong2317 分钟前
第 38 课:任务列表里高亮当前正在查看详情的任务
开发语言·前端·javascript·vue.js·学习
澈20722 分钟前
构造函数与析构函数完全指南
开发语言·c++
W230357657327 分钟前
C++ 高并发线程池实战(二):动态缓存线程池 + 调用者运行拒绝策略完整版实现
开发语言·c++·缓存
气宇轩昂固执狂29 分钟前
01-初识C语言
c语言·开发语言
t***54437 分钟前
如何在 Dev-C++ 中使用 Clang 编译器
开发语言·c++
古城小栈39 分钟前
hey 你好 “压测”
http·golang·开源
程序员Better44 分钟前
前端成功转型AI全栈,我踩过的坑都替你填上了
前端·后端·ai编程