admin 发表于 2021-12-22 23:30:28

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]
查看完整版本: golang:执行shell命令3(非阻塞执行,不等待结果)