最近处理一个需求,在golang进程中执行一个脚本,并且能够在主进程中获取脚本的输出,参照github上一些大神的代码,在此记录一下。
package main
import (
"bufio"
"fmt"
"io"
"os/exec"
"sync"
)
func main() {
Command("ping www.baidu.com")
}
func Command(cmd string) error {
// 创建要执行的命令,返回一个command的结构体,所要执行的命令其实是基于当前进程创建了一个子进程
c := exec.Command("bash", "-c", cmd)
stdout, err := c.StdoutPipe()
if err != nil {
return err
}
var wg sync.WaitGroup
// 在主进程中设置计数器加1
wg.Add(1)
go func() {
// 在goroutine中执行完成被等待的业务逻辑后计数器减1
defer wg.Done()
reader := bufio.NewReader(stdout)
for {
readString, err := reader.ReadString('\n')
if err != nil || err == io.EOF {
return
}
fmt.Print(readString)
}
}()
// 开始执行cmd的要运行的命令
err = c.Start()
// 在主进程中阻塞直到要等待的业务完成计数器为0,阻塞解除
wg.Wait()
return err
}