Golang - 执行 shell 脚本,并实时按行打印 shell 脚本输出信息


原文链接:https://blog.csdn.net/flyfreelyit/article/details/103697013

测试代码地址:https://github.com/kirinlabs/execshell

Golang 执行 shell 脚本,不接收返回值

// 返回一个 cmd 对象
cmd := exec.Command("sh", "-c", "./scripts/curl.sh")// 如果只执行命令,不接收返回值
cmd.Run()


Run(),命令其实是调用了 cmd.Start()和 cmd.Wait()两个方法,只返回一个 error 对象

Golang 执行 shell脚本,接收返回值

// 返回一个 cmd 对象
cmd := exec.Command("sh", "-c", "./scripts/curl.sh")// 收返回值[]byte, error
b,er:= cmd.Output()log.Pringln(string(b))


        返回值就是 shell 脚本打印的日志信息,但这样有一个缺点,golang 接收 shell 脚本的打印结果,必须要等待 shell 脚本全部执行完成才能一次性返回

Golang 执行 shell脚本,并实时打印 shell 脚本输出日志信息
实际业务比如:异步任务调度系统、自动发布系统等都有可能需要 shell 脚本的配合来完成,就需要实时打印 shell 脚本的中每条命令的输出日志信息,便于查看任务进度等

package mainimport ("fmt""io""log""os/exec""strings"
)func asyncLog(reader io.ReadCloser) error {cache := ""buf := make([]byte, 1024, 1024)for {num, err := reader.Read(buf)if err != nil {if err == io.EOF || strings.Contains(err.Error(), "closed") {err = nil}return err}if num > 0 {oByte := buf[:num]h.logInfo = append(h.logInfo, oByte...)oSlice := strings.Split(string(oByte), "\n")line := strings.Join(oSlice[:len(oSlice)-1], "\n")fmt.Printf("%s%s\n", cache, line)cache = oSlice[len(oSlice)-1]}}return nil
}func execute() error {cmd := exec.Command("sh", "-c", "./scripts/curl.sh")stdout, _ := cmd.StdoutPipe()stderr, _ := cmd.StderrPipe()if err := cmd.Start(); err != nil {log.Printf("Error starting command: %s......", err.Error())return err}go asyncLog(stdout)go asyncLog(stderr)if err := cmd.Wait(); err != nil {log.Printf("Error waiting for command execution: %s......", err.Error())return err}return nil
}func main(){execute()
}


shell脚本,每秒打印时间,观察 Golang 对日志的实时输出

#!/bin/bash#print time
for((i=0;i<10;i++))
dosleep 1echo $(date +"%Y-%m-%d %H:%M:%S")
done

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/581792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【持续学习系列(四)】《Lifelong-RL》

一、论文信息 1 标题 Lifelong-RL: Lifelong Relaxation Labeling for Separating Entities and Aspects in Opinion Targets 2 作者 Lei Shu, Bing Liu, Hu Xu, and Annice Kim 3 研究机构 Department of Computer Science, University of Illinois at Chicago, USACent…

MySQL 和 MySQL2 的区别

MySQL是最流行的开源关系型数据库管理系统,拥有大量的使用者和广泛的应用场景。而MySQL2是MySQL官方团队推出的新一代MySQL驱动&#xff0c;用于取代老版的MySQL模块&#xff0c;提供更好的性能和更丰富的功能。 本文将介绍MySQL2相较于MySQL有哪些优势以及具体的技术区别。 …

[Angular] 笔记 11:可观察对象(Observable)

chatgpt: 在 Angular 中&#xff0c;Observables 是用于处理异步数据流的重要工具。它们被广泛用于处理从异步操作中获取的数据&#xff0c;比如通过 HTTP 请求获取数据、定时器、用户输入等。Observables 提供了一种机制来订阅这些数据流&#xff0c;并可以在数据到达时执行相…

代码随想录算法训练营day1|704.二分查找、27.移除元素

第一章 数组 part01 今日任务 数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 详细布置 数组理论基础 文章链接&#xff1a;代码随想录 题目建议&#xff1a; 了解一下数组基础&#xff0c;以及数组的内存空间地址&#xff0c;数组也没那么简单。 704. 二…

炮炮面试——经典面试问题汇总

面试前准备 公司官网(仔细了解&#xff09;&#xff1a;成立时间&#xff0c;主营业务&#xff0c;组织架构招聘简章(重点了解)&#xff1a;任何问题都要围绕招聘简章回答&#xff0c;最好背下来岗位意义 (了解痛点) 1、自我介绍 面试官&#xff0c;您好&#xff01; …

第08章:随堂复习与企业真题(面向对象-高级)

来源&#xff1a;尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备) 基本都是宋老师发的资料里面的内容&#xff0c;只不过补充几个资料里没直接给出答案的问题的答案。 不想安装markdown笔记的app所以干脆在这里发一遍。 第08章&#xff1a;随堂复习…

Jupyter Notebook 开启远程登录

Jupyter Notebook可以说是非常好用的小工具&#xff0c;但是不经过配置只能够在本机访问 安装jupyter notebook conda install jupyter notebook 生成默认配置文件 jupyter notebook --generate-config 将会在用户主目录下生成.jupyter文件夹&#xff0c;其中jupyter_noteb…

查看ios app运行日志

摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具&#xff0c;该工具可以方便地查看iPhone设备上应用和系统运行时的实时日志和奔溃日志。同时还提供了奔溃日志分析查看模块&#xff0c;可以对苹果奔溃日志进行符号化、格式化和分析&#xff0c;极大地简化了开发者的调试…

Pandas 高级教程——IO 操作

Python Pandas 高级教程&#xff1a;IO 操作 Pandas 提供了强大的 IO 操作功能&#xff0c;可以方便地读取和写入各种数据源&#xff0c;包括文本文件、数据库、Excel 表格等。本篇博客将深入介绍 Pandas 中的高级 IO 操作&#xff0c;通过实例演示如何灵活应用这些功能。 1.…

短说社区运营的使用工具分享(一)

本文是一篇针对短说社区运营的使用工具分享帖&#xff0c;是小编结合日常使用&#xff0c;总结的一些可以帮助网站管理员和运营人员进行日常操作和管理的工具。 1. 想天工作台之运营面板 想天工作台可以将桌面划分不同的类型来辅助办公&#xff0c;我分享下我当前的桌面情况&…

基于Mbed Studio环境下开发STM32

基于Mbed Studio环境下开发STM32 &#x1f4cd;Mbed官网&#xff1a;https://os.mbed.com/ ✨mbed OS是ARM出的一个免费开源的&#xff0c;面向物联网的操作系统。提供了一个定义良好的API来开发C应用程序&#xff1b;集成度很高&#xff0c;类似Arduino&#xff0c;目前并不兼…

新兴品牌如何做好传播?媒介盒子分享三招

很多品牌抓住了品类和流量红利&#xff0c;给自己做了传播&#xff0c;但是红利是有时效的&#xff0c;流量越来越贵&#xff0c;竞争对手你追我赶&#xff0c;只有真正占领用户心智&#xff0c;才能获取长期利润。今天媒介盒子就来和大家聊聊&#xff1a;新兴品牌如何做好传播…

elementui 表单校验validate不起效果

原因&#xff1a; 自定义的validator验证方式需要调用callback。 验证失败callabck(new Errno(‘’)). 验证成功 callback() var checkNumber3 (rule, value, callback) > {if (value && !Number.isInteger(value)) {callback(new Error("请输入数字值"…

Java 中 Lambda 表达式的使用

目录 一、Lambda 表达式的概念 二、Lambda 表达式的语法格式 三、Lambda 表达式的案例使用 1、使用 Lambda 来实现启动线程 2、使用 Lambda 表达式实现集合的排序 3、使用 Lambda 表达式实现文件夹下的文件查找 一、Lambda 表达式的概念 Lambda 表达式是特殊的匿名内部类…

用katalon解决接口/自动化测试拦路虎--参数化

不管是做接口测试还是做自动化测试&#xff0c;参数化肯定是一个绕不过去的坎。 因为我们要考虑到多个接口都使用相同参数的问题。所以&#xff0c;本文将讲述一下katalon是如何进行参数化的。 全局变量 右侧菜单栏中打开profile&#xff0c;点击default&#xff0c;打开之后…

[spark] SaveMode

https://spark.apache.org/docs/latest/api/java/index.html?org/apache/spark/sql/SaveMode.html Overwrite 覆盖模式是指将DataFrame保存到数据源时&#xff0c;如果数据/表已经存在&#xff0c;则现有数据将被DataFrame的内容覆盖。 注意: Overwrite 模式会覆盖已存在的表…

Alibaba Cloud Linux 3.2104 LTS 64位镜像兼容和性能如何?

阿里云Alibaba Cloud Linux 3.2104 LTS 64位镜像是可以选择的&#xff0c;它阿里云打造的Linux服务器操作系统发行版&#xff0c;针对云服务器ECS做了大量深度优化&#xff0c;完全兼容RHEL/CentOS生态和操作方式&#xff0c;如果是阿里云服务器ECS建议选择Alibaba Cloud Linux…

室内设计师效果图云渲染好?还是本地渲染好?

室内设计师在设计项目中经常面临一个关键的技术选择&#xff1a;使用云渲染服务或本地渲染完成效果图渲染呢&#xff1f;每种方式都有其独的优势与不足&#xff0c;且影响整个设计的完成速度、质量和成本。当然还有部分人群不知道云渲染是什么&#xff1f;本文整理关于云渲染的…

Mybatis Java API - Using Mappers

<T> T getMapper(Class<T> type) 您提到的插入&#xff08;insert&#xff09;、更新&#xff08;update&#xff09;、删除&#xff08;delete&#xff09;和查询&#xff08;select&#xff09;方法对于一些操作来说确实很强大&#xff0c;但它们也比较冗长、不…

完全背包问题,原理剖析,公式推导,OJ详解

文章目录 前言一、完全背包的状态设计1、状态设计2、状态转移方程3、对比0/1背包问题4、时间复杂度分析 二、完全背包问题的优化1、时间复杂度优化2、空间复杂度优化 三、OJ练习裸题完全背包离散化最小值 前言 完全背包问题&#xff0c;相比0/1背包问题&#xff0c;实就每个物品…