【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)
	}
}
相关推荐
七夜zippoe7 分钟前
事件驱动架构:构建高并发松耦合系统的Python实战
开发语言·python·架构·eda·事件驱动
古城小栈14 分钟前
Rust Trait 敲黑板
开发语言·rust
hashiqimiya39 分钟前
springboot事务触发滚动与不滚蛋
java·spring boot·后端
FL171713141 小时前
MATLAB的Sensitivity Analyzer
开发语言·matlab
TeamDev1 小时前
基于 Angular UI 的 C# 桌面应用
前端·后端·angular.js
PPPHUANG1 小时前
一次 CompletableFuture 误用,如何耗尽 IO 线程池并拖垮整个系统
java·后端·代码规范
用户8356290780511 小时前
用Python轻松管理Word页脚:批量处理与多节文档技巧
后端·python
lly2024061 小时前
jEasyUI 设置排序指南
开发语言
一起努力啊~2 小时前
算法刷题--长度最小的子数组
开发语言·数据结构·算法·leetcode
想用offer打牌2 小时前
一站式了解Spring AI Alibaba的流式输出
java·人工智能·后端