Golang语言执行linux命令行

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值