【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)
	}
}
相关推荐
时光追逐者几秒前
在 Blazor 中使用 Chart.js 快速创建数据可视化图表
开发语言·javascript·信息可视化·c#·.net·blazor
独好紫罗兰2 分钟前
洛谷题单3-P5718 【深基4.例2】找最小值-python-流程图重构
开发语言·python·算法
小天努力学java5 分钟前
【面试题】如何用两个线程轮流输出0-200的值
java·开发语言
云边有个稻草人8 分钟前
【C++】第八节—string类(上)——详解+代码示例
开发语言·c++·迭代器·string类·语法糖auto和范围for·string类的常用接口·operator[]
夏天想27 分钟前
vant4+vue3上传一个pdf文件并实现pdf的预览。使用插件pdf.js
开发语言·javascript·pdf·vant
惊鸿一博29 分钟前
c++ &&(通用引用)和&(左值引用)区别
开发语言·c++
企鹅不耐热.32 分钟前
Scala基础知识6
开发语言·后端·scala
A林玖33 分钟前
【计算机相关学习】R语言
开发语言·学习·r语言
程序员一诺41 分钟前
【Django开发】前后端分离django美多商城项目第15篇:商品搜索,1. Haystack介绍和安装配置【附代码文档】
后端·python·django·框架
暮雨哀尘1 小时前
微信小程序开发:开发实践
开发语言·算法·微信小程序·小程序·notepad++·性能·技术选型