golang:执行shell命令3(非阻塞执行,不等待结果)
■实例说明我们经常需要执行本地shell命令,或者是执行其他二进制可执行文件
1)执行本地二进制可执行文件
2)非阻塞执行,即不等待执行完成直接继续
■实例代码
package main
import (
"bytes"
"fmt"
"os/exec"
)
// ExecShellNoBlock 执行shell命令,非阻塞,即不等待执行结果
func ExecShellNoBlock(cmd string) (string, error) {
shell := exec.Command("/bin/bash", "-c", cmd)
// 重定向执行命令的标准输出和标准错误
var out bytes.Buffer
shell.Stdout = &out
shell.Stderr = &out
// 1、执行命令,这里不会等待命令执行完成,调用start后,命令已经开始执行了
err := shell.Start()
fmt.Println("continue to exec ...")
// 2、这里可以继续执行其他操作了,同时上面的shell命令也在执行中了
for i := 0; i < 2; i++ {
fmt.Println("do something")
}
// 这里才会等待命令执行完成
// 为什么我们要等待脚本执行完成?如果不等待,如果我们这个测试程序的main函数执行完成了,但这个脚本还没有执行完成,会被立即终止掉
shell.Wait()
// 当然,我们完全可以不使用shell.Wait()等待脚本执行,完全可以像下面一样sleep 几秒钟来等待脚本执行完成。
//time.Sleep(11 * time.Second)
// 返回执行结果
return out.String(), err
}
func main() {
// 等待10秒,然后输出hello world
cmd := "sleep 10;echo hello world"
out, _ := ExecShellNoBlock(cmd)
fmt.Println(out)
//continue to exec ...
//do something
//do something
//hello world (10秒后才输出这行内容)
}
页:
[1]