前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[方法]使用Go语言去调度cmd执行命令汇总

[方法]使用Go语言去调度cmd执行命令汇总

作者头像
小锟哥哥
发布2022-05-10 08:13:09
1.8K0
发布2022-05-10 08:13:09
举报
文章被收录于专栏:GoLang全栈
引子
1、使用场景

可能有人在问在什么情况下使用到这项技能,当你需要去调用本地脚本完成相关操作时,或者需要通过shell命令去获取系统相关信息时,便需要使用到这项技能。

实战开始
1、只执行,不需要结果

当你在命令里面执行输出命令时:

代码语言:javascript
复制
echo 123;

我们可以在go语言中这样去调用:

代码语言:javascript
复制
//只是执行,不需要结果
func OnlyRun()  {
    var(
        cmd *exec.Cmd
        err error
    )

    cmd = exec.Command("bash", "-c", "echo 123")
    err = cmd.Run()

    fmt.Println(err)
}

执行结果:

代码语言:javascript
复制
<nil>
2、执行后需要拿到结果

有时你可能需要执行一个命令拿到执行结果,比如让他帮我计算 1+1=?,你可能会这样执行:

代码语言:javascript
复制
echo `expr 1 + 1`;

我们在go语言中可以这样玩:

代码语言:javascript
复制
//需要获取执行结果
func GetRunValue()  {
    var(
        cmd *exec.Cmd
        err error
        output []byte
    )

    cmd = exec.Command("bash","-c","echo `expr 1 + 1`;")

    if output, err = cmd.CombinedOutput(); err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(string(output))
}

执行结果是:

代码语言:javascript
复制
2
3、执行到一半我想把它杀死

这也算刚需吧,如果一个程序执行时卡死了,我们得把它kill掉吧,这我们就要需要使用到go语言中的goroutine去执行了。

我们模拟的使用场景是这样的: 我们先让程序睡眠3秒,来模拟这个程序在一直在执行,3秒后输出 hello,在执行到第1秒时我们把它杀掉。

我的shell脚本是这样的:

代码语言:javascript
复制
sleep 3;echo hello;

我们go语言中是这样玩的:

代码语言:javascript
复制
//执行完发挥的数据结构
type result struct {
    err error
    output []byte
}

//能够杀死的进程
func CanKillRun()  {
    var(
        cmd *exec.Cmd
        ctx context.Context
        cancelFunc context.CancelFunc
        resultChan chan *result
        res *result
    )

    //创建一个通道用户协程交换数据
    resultChan = make(chan *result, 1000)

    //拿到这个上下文的取消方法
    ctx, cancelFunc = context.WithCancel(context.TODO())

    //起一个goroutine 可以理解是子进程去处理
    go func() {
        var (
            output []byte
            err error
        )
        cmd = exec.CommandContext(ctx,"bash", "-c","sleep 3;echo hello;")

        //执行任务,捕捉输出
        output, err = cmd.CombinedOutput()

        //把任务执行结果输出给main协程
        resultChan <- &result{
            err:err,
            output:output,
        }
    }()

    //1s 后我们就把他杀死
    //继续往下走
    time.Sleep(1 * time.Second)
    //取消上下文
    cancelFunc()

    //读取通道里面的数据
    res = <- resultChan

    //打印结果
    fmt.Println(res.err, string(res.output))
}

我们的执行结果是:

代码语言:javascript
复制
signal: killed

到这里咱们就结束了,如果有啥疑问,可以给我留言。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引子
    • 1、使用场景
    • 实战开始
      • 1、只执行,不需要结果
        • 2、执行后需要拿到结果
          • 3、执行到一半我想把它杀死
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档