go任务调度1(go的操作系统命令调用)

梁十八 · · 1024 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    var (
        cmd *exec.Cmd
        err error
    )

    cmd = exec.Command("/bin/bash", "-c", "echo 1")
    err = cmd.Run()
    fmt.Println(err)
}

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    var (
        cmd *exec.Cmd
        output []byte
        err error
    )

    // 生成Cmd
    cmd = exec.Command("/bin/bash", "-c", "ls -la /")

    // 执行了命令, 捕获了子进程的输出( pipe )
    if output, err = cmd.CombinedOutput(); err != nil {
        fmt.Println(err)
        return
    }

    //打印子进程的输出
    fmt.Println(string(output))

}

goroutine执行linux命令,睡了2秒。而main睡一秒就杀死了bash,输出结果为:signal: killed:

package main

import (
    "context"
    "fmt"
    "os/exec"
    "time"
)

type result struct {
    err error
    output []byte
}

func main() {
    //执行一个cmd,让它在一个协程里执行,让它执行2秒

    //1秒的时候,我们杀死cmd
    var (
        ctx context.Context
        cancelFunc context.CancelFunc
        cmd *exec.Cmd
        resultChan chan *result
        res *result
    )

    //创建一个结果队列
    resultChan = make(chan *result, 1000)

    //context里有个channel,返回一个cancelFunc来关掉channel

    //context.上下文继承了context.TODO()上下文
    ctx,cancelFunc = context.WithCancel(context.TODO())

    go func() {
        var (
            output []byte
            err error
        )
        //exec.Command()是没办法被取消的
        cmd = exec.CommandContext(ctx,"/bin/bash", "-c", "sleep 2;echo hello;") //里面有个select{case <- ctx.Done()},一旦检测到调用了cancelFunc,则kill掉bash程序(kill pid,进程id,杀死子进程)

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

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

    //继续往下走
    time.Sleep(1 * time.Second)

    //取消上下文
    cancelFunc()

    //在main协程里, 等待子协程的退出,并打印任务执行结果
    res = <- resultChan

    // 打印任务执行结果
    fmt.Println(res.err, string(res.output))

}

有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:梁十八

查看原文:go任务调度1(go的操作系统命令调用)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1024 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传