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

骑猪看日落 2022-01-10 11:33 156阅读 0赞
  1. package main
  2. import (
  3. "fmt"
  4. "os/exec"
  5. )
  6. func main() {
  7. var (
  8. cmd *exec.Cmd
  9. err error
  10. )
  11. cmd = exec.Command("/bin/bash", "-c", "echo 1")
  12. err = cmd.Run()
  13. fmt.Println(err)
  14. }

  1. package main
  2. import (
  3. "fmt"
  4. "os/exec"
  5. )
  6. func main() {
  7. var (
  8. cmd *exec.Cmd
  9. output []byte
  10. err error
  11. )
  12. // 生成Cmd
  13. cmd = exec.Command("/bin/bash", "-c", "ls -la /")
  14. // 执行了命令, 捕获了子进程的输出( pipe )
  15. if output, err = cmd.CombinedOutput(); err != nil {
  16. fmt.Println(err)
  17. return
  18. }
  19. //打印子进程的输出
  20. fmt.Println(string(output))
  21. }

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

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "os/exec"
  6. "time"
  7. )
  8. type result struct {
  9. err error
  10. output []byte
  11. }
  12. func main() {
  13. //执行一个cmd,让它在一个协程里执行,让它执行2秒
  14. //1秒的时候,我们杀死cmd
  15. var (
  16. ctx context.Context
  17. cancelFunc context.CancelFunc
  18. cmd *exec.Cmd
  19. resultChan chan *result
  20. res *result
  21. )
  22. //创建一个结果队列
  23. resultChan = make(chan *result, 1000)
  24. //context里有个channel,返回一个cancelFunc来关掉channel
  25. //context.上下文继承了context.TODO()上下文
  26. ctx,cancelFunc = context.WithCancel(context.TODO())
  27. go func() {
  28. var (
  29. output []byte
  30. err error
  31. )
  32. //exec.Command()是没办法被取消的
  33. cmd = exec.CommandContext(ctx,"/bin/bash", "-c", "sleep 2;echo hello;") //里面有个select{case <- ctx.Done()},一旦检测到调用了cancelFunc,则kill掉bash程序(kill pid,进程id,杀死子进程)
  34. //执行任务,捕获输出
  35. output, err = cmd.CombinedOutput()
  36. //把任务输出结果传给main协程
  37. resultChan <- &result{
  38. err: err,
  39. output: output,
  40. }
  41. }()
  42. //继续往下走
  43. time.Sleep(1 * time.Second)
  44. //取消上下文
  45. cancelFunc()
  46. //在main协程里, 等待子协程的退出,并打印任务执行结果
  47. res = <- resultChan
  48. // 打印任务执行结果
  49. fmt.Println(res.err, string(res.output))
  50. }

转载于:https://blog.51cto.com/5660061/2381502

发表评论

表情:
评论列表 (有 0 条评论,156人围观)

还没有评论,来说两句吧...

相关阅读