您的当前位置:首页>全部文章>文章详情

【Go】Go语言执行linux命令行

CrazyPanda发表于:2024-02-26 23:01:20浏览:369次TAG:
package main

/* Golang语言执行linux命令行 */

import (
	"fmt"
	"io/ioutil"
	"os/exec"
	"time"
)

func run() {
	cmd := exec.Command("/bin/bash", "-c", "ping 127.0.0.1")
	// 命令的输出直接扔掉
	_, err := cmd.Output()
	// 命令出错
	if err != nil {
		panic(err.Error())
	}
	// 命令启动和启动时出错
	if err := cmd.Start(); err != nil {
		panic(err.Error())
	}
	// 等待结束
	if err := cmd.Wait(); err != nil {
		panic(err.Error())
	}
}
func main() {
	// 异步线程
	go run()
	fmt.Println(time.Now().Format("2006.01.02 15:04:05"))
	// 等待1秒
	time.Sleep(1e9)
	cmd := exec.Command("/bin/bash", "-c", `ps -ef | grep -v "grep" | grep "ping"`)
	// 接收命令的标准输出
	stdout, err := cmd.StdoutPipe()
	if err != nil {
		fmt.Println("StdoutPipe: " + err.Error())
		return
	}
	// 接受命令的标准错误
	stderr, err := cmd.StderrPipe()
	if err != nil {
		fmt.Println("StderrPipe: ", err.Error())
		return
	}
	// 启动
	if err := cmd.Start(); err != nil {
		fmt.Println("Start: ", err.Error())
		return
	}
	// 读取错误信息
	bytesErr, err := ioutil.ReadAll(stderr)
	if err != nil {
		fmt.Println("ReadAll stderr: ", err.Error())
		return
	}
	if len(bytesErr) != 0 {
		fmt.Printf("stderr is not nil: %s", bytesErr)
		return
	}
	// 读取输出
	bytes, err := ioutil.ReadAll(stdout)
	if err != nil {
		fmt.Println("ReadAll stdout: ", err.Error())
		return
	}
	// 等等命令执行完成
	if err := cmd.Wait(); err != nil {
		fmt.Println("Wait: ", err.Error())
		return
	}
	// 打印输出
	fmt.Printf("stdout: %s", bytes)
	// 等待主程序退出,携程退出.
	time.Sleep(1e9 * 10)
}

// 运行命令: go run main.go

注明

cmd.Output() 会自带启动start并等程序执行完成把b,err返回,在此之前阻塞下面的指令。
cmd.Start() 启动而不阻塞。
cmd.Wart() 需要和Start配合,cmd返回前阻塞。

package main

import (
	"fmt"
	"os/exec"
)

func main() {
	c := exec.Command("/bin/bash", "-c", "vmstat 1 5")
	fmt.Printf("our==> %s", "000\n")
	// _, err := c.Output()
	// if err != nil {
	// 	fmt.Println("err==> ", err)
	// 	return
	// }
	fmt.Printf("our==> %s", "111\n")
	c.Start()
	fmt.Printf("our==> %s", "222\n")
	c.Wait()
	fmt.Printf("our==> %s", "333\n")
}

注明:

cmd.StdoutPipe() 使用也不能实时拿到cmd输出
cmd.StderrPipe() 使用也不能实时拿到cmd输出

package main

import (
	"fmt"
	"io/ioutil"
	"os/exec"
)

func main() {
	c := exec.Command("/bin/bash", "-c", "vmstat 1 5")
	fmt.Printf("out==> %s", "000\n")
	stdout, _ := c.StdoutPipe()
	stderr, _ := c.StderrPipe()
	c.Start()
	b1, _ := ioutil.ReadAll(stdout)  //只有这个有输出. 且是5秒后。
	b2, _ := ioutil.ReadAll(stderr)
	fmt.Printf("1out==> %s", b1)
	fmt.Printf("2err==> %s", b2)
	c.Wait()
	b1, _ = ioutil.ReadAll(stdout)
	b2, _ = ioutil.ReadAll(stderr)
	fmt.Printf("3out==> %s", b1)
	fmt.Printf("4err==> %s", b2)
}

猜你喜欢

【Go】Go语言常用命令详解(三)
前言接着上一篇继续介绍Go语言的常用命令常用命令以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和管理依赖项等任务。命令描述go build编译Go程序包及其依赖项。go test运行包的测试。go run编译并运行Go程序。go clean删除编译生成的对象文件和缓存文件。go bug启动一个用于报告bug的工具。go doc显示有关包或符号的文档。go env打印有关Go环境的信息。go fix更新包以使用新的API。go fmt使用gofmt重新格式化Go包的源
发表于:2024-03-07 浏览:319 TAG:
【Go】Go语言工程结构详述
前言当创建一个Go语言项目时,良好的工程结构是确保项目可维护性、可扩展性和清晰性的关键。虽然Go本身没有强制性的项目结构要求,但是采用一致性的布局和组织方式能够让团队更容易理解和维护代码。在Go语言中,项目结构可以根据具体需求有所不同,但通常遵循一些共同的约定。以下是一个通用的Go语言工程结构的示例:myproject/ |-- cmd/ |   |-- myapp/ |      &n
发表于:2024-03-05 浏览:328 TAG:
【Go】使用Goland创建并运行项目
文章目录**前言**创建新项目编辑运行/调试配置编写并运行代码总结强烈推荐专栏集锦写在最后前言在Go语言的开发过程中,选择一个合适的集成开发环境(IDE)是提高效率和编写可维护代码的关键一步。JetBrains的Goland作为一款专门为Go语言开发的IDE,提供了丰富的功能和强大的工具,使得开发人员能够更轻松地构建和维护Go项目。本文将引导您通过Goland的简单步骤,创建和运行您的第一个Go语言项目。无论您是初学者还是经验丰富的Go开发者,Goland都能够提供出色的开发体验,帮助您更加专注
发表于:2024-03-06 浏览:341 TAG:
【Go】Golang打包go项目部署到linux服务器正确方法
网上方法正确方法总结 网上方法我们可以在终端中输入以下代码:set CGO_ENABLED=0 set GOOS=linux set GOARCH=amd64 go build -o main-linux main.go然后就会生成main-linux的二进制可执行文件,然后我们就可以将main-linux放到服务器中的任一目录中,然后我们就可以执行以下命令运行。> chmod 777&nb
发表于:2024-08-06 浏览:278 TAG: #Golang
【Go】Goland常用快捷键介绍
文章目录前言一、文件操作相关快捷键二、代码格式化相关的快捷键三、查找和定位相关的快捷键四、编辑代码相关的快捷键四、编辑器相关的快捷键总结强烈推荐专栏集锦写在最后开源软件的影响力 前言在进行Go语言开发时,熟练使用快捷键是提高效率、加快编码速度的关键。Goland作为一款强大的集成开发环境(IDE),提供了丰富的快捷键功能,可以帮助开发者更加便捷地进行代码导航、编辑、调试等操作。通过掌握这些常用的快捷键,可以更加高效地编写和管理您的Go代码,节省大量的开发时间,提高工作效率。一、文件操作相关快捷键
发表于:2024-03-06 浏览:352 TAG:
【Go】Go语言执行linux命令行
ackage main /* Golang语言执行linux命令行 */ import ( "fmt" "io/ioutil" "os/exec" "time" ) func run() { cmd := exec.Command("/bin/bash", "-c",&n
发表于:2024-02-26 浏览:370 TAG:
【Go】Golang标准库介绍(一)
随着计算机科学的迅猛发展,编程语言也在不断涌现。在这个多样化的编程语言生态系统中,Go语言凭借其简洁、高效、并发支持等特性逐渐崭露头角。作为一门开源的静态编程语言,Go语言自带了丰富的标准库,为开发者提供了强大的工具和功能。本文将深入介绍Go语言几种标准库,帮助读者更好地了解和利用这些库,提高编程效率。1. bufio(带缓冲的 I/O 操作)在Go语言的标准库中,bufio(buffered I/O)库提供了带缓冲区的输入输出功能,用于提高读写效率。它通过在输入输出流上添加缓冲区,减少了频繁的
发表于:2024-03-02 浏览:291 TAG:
【Go】Go的数据挖掘与机器学习框架
1.背景介绍Go是一种现代的、高性能的、静态类型的编程语言,它由Google开发并于2009年发布。Go语言的设计目标是简单、可靠和高性能。Go语言的特点是简单的语法、强大的标准库、垃圾回收、并发处理等。Go语言的发展非常快速,已经被广泛应用于云计算、大数据、机器学习等领域。在大数据和机器学习领域,Go语言的优势在于其高性能、并发处理能力和简单易用的语法。Go语言的标准库提供了丰富的数据处理和并发处理功能,这使得Go语言成为处理大量数据和实时处理数据的理想语言。在本文中,我们将讨论Go语言在数据
发表于:2024-02-27 浏览:318 TAG:
【Go】Golang如何有效地操作数组数据
Go语言是一种强大且高效的编程语言,它支持多种数据结构,其中包括数组。在Go语言中,数组是一种固定长度、相同类型元素的数据结构。通过正确使用数组方法,可以更有效地操作数组数据。本文将重点介绍如何在Go语言中使用数组方法来操作数组数据,并提供具体的代码示例。1. 声明数组在Go语言中,声明数组的语法如下:var arr [5]int // 声明一个包含5个整数的数组登录后复制2. 初始化数组可以通过以下方式来初始化数组:arr := [5
发表于:2024-03-22 浏览:290 TAG:
【Go】Golang标准库介绍(三)
1. image库 (常见图形格式的访问及生成)在 Go 语言的标准库中,image 包提供了对图像的基本操作和处理功能。这个包定义了 Image 接口和一些基本的图像类型,同时也包含了一些实现了该接口的具体类型,如 image.RGBA 和 image.Gray。关键概念和类型:1. Image 接口: 定义了图像的基本操作,包括获取像素值、设置像素值等。 2. RGBA 类型: 表示一个带有红、绿、蓝和透明度通道的图像。 3.&nb
发表于:2024-03-04 浏览:362 TAG: