当前位置: 首页 > article >正文

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

背景

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

代码

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)
	}
}


http://www.kler.cn/a/228535.html

相关文章:

  • 【C++】size_t全面解析与深入拓展
  • 【CPU】RISC-V中的PMP物理内存保护单元
  • EXCEL的一些用法记录
  • 第12章:Python TDD完善货币加法运算(一)
  • JavaScript语言的软件工程
  • 鸿蒙开发中的骨架图:提升用户体验的关键一环
  • C# 怎么判断屏幕是第几屏幕?屏幕是垂直还是水平?屏幕的分辨率?
  • 【Linux】静态库和动态库
  • Linux环境生成allure测试报告
  • 龙行龘龘迎新春,书写春联送祝福
  • 云计算关键技术
  • 3、安全开发-Python-协议库爆破FTPSSHRedisMYSQLSMTP等
  • 紫光展锐M6780丨用MEMC捕捉每帧精彩
  • 计算机网络_1.6.3 计算机网络体系结构分层思想举例
  • 蓝桥杯2024/1/31-----底层测试模板
  • 一篇文章认识Vue3
  • 语言类型(静态语言、动态语言)
  • leetcode680 验证回文串 II
  • 行测怎么搜题答案?推荐你使用这七个公众号和工具 #经验分享#职场发展#学习方法
  • 七月论文审稿GPT第2.5版:微调GPT3.5 turbo 16K和llama2 13B以扩大对GPT4的优势
  • 【51单片机】直流电机实验和步进电机实验
  • JavaSE-项目小结-IP归属地查询(本地IP地址库)
  • 突破编程_C++_基础教程(指针)
  • Java on Azure Tooling 2024年1月更新|Azure Key Vault 支持、示例项目创建支持及更多
  • 【Java网络编程05】网络原理进阶(三)
  • 运维自动化bingo前端