【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)
	}
}
相关推荐
怎么没有名字注册了啊7 分钟前
崩溃解决_Qt子窗口关闭按钮后打开崩溃
开发语言·qt
Dxy123931021614 分钟前
JavaScript 如何捕获异常:从基础到进阶的完整指南
开发语言·javascript·udp
!停28 分钟前
C++入门—初阶模板
开发语言·c++
so2F32hj229 分钟前
拆解 OpenHands(14)--- Microagents
java·开发语言
Jp7gnUWcI43 分钟前
C++ 内存避坑指南:如何用移动语义和智能指针解决“深拷贝”与“内存泄漏”
开发语言·c++
xcs194051 小时前
Java 上位机防空警报系统开发
java·开发语言
追光的蜗牛丿1 小时前
C++中引用与指针的选择
开发语言·c++
Three~stone1 小时前
MATLAB vs Python 两者区别和安装教程
开发语言·python·matlab
@atweiwei1 小时前
Go语言并发编程面试题精讲(下)
面试·golang·并发·channel
soragui1 小时前
【Python】第 1 章:Python 解释器原理
开发语言·python