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

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

CrazyPanda发表于:2024-02-26 23:01:20浏览:377次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】Gotk3简介
在软件开发的世界里,GUI(图形用户界面)工具包是创造美观且交互性良好的应用的关键组件。Gotk3是一个强大的开源项目,它将流行的GTK+3库与Go语言无缝结合,为Go开发者提供了一个高效、跨平台的GUI构建框架。如果你正在寻找一种简单的方式来构建桌面应用,那么Gotk3值得你的关注。GO-TKGo-Tk是Go编程语言的一款图形用户接口(GUI)框架。它具有简洁的语法、可移植性好、跨平台性强等特点,适用于各种场景的GUI开发。Go-Tk由两部分组成,即类似tkinter的控件封装和底层的C语言绑
发表于:2024-06-07 浏览:310 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 浏览:284 TAG: #Golang
【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 浏览:379 TAG:
【Go】Go的数据挖掘与机器学习框架
1.背景介绍Go是一种现代的、高性能的、静态类型的编程语言,它由Google开发并于2009年发布。Go语言的设计目标是简单、可靠和高性能。Go语言的特点是简单的语法、强大的标准库、垃圾回收、并发处理等。Go语言的发展非常快速,已经被广泛应用于云计算、大数据、机器学习等领域。在大数据和机器学习领域,Go语言的优势在于其高性能、并发处理能力和简单易用的语法。Go语言的标准库提供了丰富的数据处理和并发处理功能,这使得Go语言成为处理大量数据和实时处理数据的理想语言。在本文中,我们将讨论Go语言在数据
发表于:2024-02-27 浏览:326 TAG:
【Go】go依赖注入库samber/do使用
介绍以简单和高效而闻名的Go语言在其1.18版本中引入了泛型,这可以显着减少大量代码生成的需要,使该语言更加强大和灵活。如果您有兴趣, Go 泛型教程 是很好的学习资源。通过使用 Go 的泛型,samber/do库为依赖注入 (DI) 提供了一个很好的解决方案。依赖注入是一种重要的设计模式,它促进对象及其依赖关系之间的松散耦合,从而提高代码模块化性、可测试性和可维护性。泛型和依赖注入的结合进一步提升了 Go 在创建高效、可扩展软件方面的潜力。在本文中,您将学习如何使用 samber/do 提供依
发表于:2024-02-24 浏览:352 TAG:
【Go】Go语言的特点和优势
Go语言是一种开源的编程语言,它在2009年由Google开发并在2012年正式发布。Go语言的主要设计目标是提供一种简单有效的方法来构建简单、可靠、高效的软件。 Go语言的主要特点和优势包括: 静态类型:Go语言是一种静态类型的语言,这意味着所有变量在编译时就必须确定其数据类型。 自动垃圾回收:Go语言具有自动的垃圾回收机制,这意味着开发者不需要手动管理内存。 并行进程:Go语言支持并行进程,这使得开发者可以利用多核处理器的优势来编写并发程序。&nbs
发表于:2024-07-01 浏览:312 TAG:
【Go】Golang为什么成为程序员的首选
在当今快速发展的科技时代,程序员这一职业已经成为越来越受人们青睐的职业选择。而在众多编程语言中,Go语言由于其简洁、高效、并发能力强等优势,逐渐成为许多程序员的首选。本文将探讨为什么越来越多的程序员将Go语言作为他们的首选,通过具体的代码示例展示Go语言的强大之处。一、Go语言简洁高效Go语言由Google开发,设计初衷是为了解决大型项目的工程问题,因此在语法设计上追求简洁高效。代码量少,结构清晰,易于阅读和维护。下面是一个简单的Hello World示例:package main &
发表于:2024-03-14 浏览:296 TAG:
【Go】Go语言变量的声明
文章目录前言:基本类型:变量的命名规范:变量的声明总结:强烈推荐专栏集锦写在最后1.声明单个变量:2.声明多个变量:3.批量声明变量:4.声明并初始化变量:5.声明多个变量并初始化:6.简短语法赋值:一般语法:简短语法:举例:前言:在Go语言中,变量的声明是编写程序时的基础之一。使用 var 关键字可以定义单个或多个变量,并且可以选择是否初始化这些变量。Go语言的静态类型系统要求在声明变量时指定变量的类型,但也提供了类型推断功能,使得在某些情况下可以省略类型声明。本文将介绍如何使用 var 关键
发表于:2024-03-06 浏览:324 TAG:
【Go】Golang如何有效地操作数组数据
Go语言是一种强大且高效的编程语言,它支持多种数据结构,其中包括数组。在Go语言中,数组是一种固定长度、相同类型元素的数据结构。通过正确使用数组方法,可以更有效地操作数组数据。本文将重点介绍如何在Go语言中使用数组方法来操作数组数据,并提供具体的代码示例。1. 声明数组在Go语言中,声明数组的语法如下:var arr [5]int // 声明一个包含5个整数的数组登录后复制2. 初始化数组可以通过以下方式来初始化数组:arr := [5
发表于:2024-03-22 浏览:296 TAG:
【Go】go语言的特点和优势
Go语言是一种开源的、编译型的、并发型的编程语言,由谷歌于2009年推出。Go语言的设计目标是简单、高效、可靠,并能够轻松地构建大型分布式系统。优势简单易学: Go语言的语法非常简单,学习曲线平缓,即使是初学者也能快速掌握。高效: Go语言的编译速度非常快,并且生成的二进制文件也非常小,这使得它非常适合构建高性能的应用程序。并发: Go语言内置了对并发编程的支持,使得开发人员可以轻松地编写并发程序。可靠: Go语言提供了许多内置的错误处理机制,这使得它非常适合构建可靠的应用程序。跨平台: Go语
发表于:2024-07-01 浏览:294 TAG: