go基础库之调用外部进程

Go二进制文件还可以用作各种实用程序的工具,并且go run也可以用作bash脚本的代替品。

调用外部进程

Golang 版本

1.12.1

前言

Go二进制文件还可以用作各种实用程序的工具,并且go run也可以用作bash脚本的代替品。

实现

创建文件run.go文件,代码如下:

package main

import (
	"bytes"
	"fmt"
	"os/exec"
)

func main() {
	prc := exec.Command("ls", "-a")
	out := bytes.NewBuffer([]byte{})
	prc.Stdout = out
	err := prc.Run()
	if err != nil {
		fmt.Println(err)
	}

	if prc.ProcessState.Success() {
		fmt.Println("执行成功:")
		fmt.Println(out.String())
	}
}

$ go run run.go
执行成功:
.
..
run.go

创建文件start.go文件,代码如下:

package main

import (
	"bytes"
	"fmt"
	"os/exec"
)

func main() {
	prc := exec.Command("ls", "-a")
	out := bytes.NewBuffer([]byte{})
	prc.Stdout = out
	err := prc.Start()
	if err != nil {
		fmt.Println(err)
	}
	prc.Wait()
	if prc.ProcessState.Success() {
		fmt.Println("执行成功:")
		fmt.Println(out.String())
	}
}

$ go run start.go
执行成功:
.
..
run.go
start.go

原理

Go标准库提供了一种简单的调用外部进程的方法,可以通过os/exec包中的Command方法实现。

最简单的方法是创建Cmd结构体并调用Run方法。Run方法执行进程并等待它完成。如果命令错误退出,则err值不为空。

这更适合调用OS utils和工具,因为程序不会挂起太久。

外部进程也可以异步执行。通过调用Cmd结构体的Start方法来实现。在这种情况下,外部进程执行,但是主goroutine不会等到它结束。Wait方法可用于等待进程结束。等待方法完成后,进程的资源将被释放。

这种方法更适用于执行程序的外部依赖存在耗时的流程和服务。