温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-07-28 15:44:15 来源:网络 阅读:766 作者:梁十八 栏目:编程语言
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)) }
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI