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
方法可用于等待进程结束。等待方法完成后,进程的资源将被释放。
这种方法更适用于执行程序的外部依赖存在耗时的流程和服务。