cmd_Task.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package utils
  2. import (
  3. "fmt"
  4. "os"
  5. "os/exec"
  6. "strings"
  7. "sync"
  8. )
  9. type RunTask interface {
  10. AddTask()
  11. RunTask()
  12. }
  13. // T: Task任务
  14. type T struct {
  15. sync.Mutex
  16. // ch: 获取时间channel
  17. ch chan struct{}
  18. // 记录pid 用于kill
  19. pid int
  20. // 执行shell命令
  21. exec.Cmd
  22. }
  23. // NewT: 实例化方法
  24. func NewT(path string, args []string, environment ...[]string) *T {
  25. env := os.Environ()
  26. if len(environment) > 0 {
  27. for k, v := range environment[0] {
  28. env[k] = v
  29. }
  30. }
  31. t := &T{
  32. Mutex: sync.Mutex{},
  33. ch: make(chan struct{}),
  34. Cmd: exec.Cmd{
  35. Path: path,
  36. Args: []string{path},
  37. Env: env,
  38. Stdin: os.Stdin,
  39. Stdout: os.Stdout,
  40. Stderr: os.Stderr,
  41. ExtraFiles: make([]*os.File, 0),
  42. },
  43. pid: os.Getpid(),
  44. }
  45. t.Dir, _ = os.Getwd()
  46. if len(args) > 0 {
  47. // Exclude of current binary path.
  48. start := 0
  49. if strings.EqualFold(path, args[0]) {
  50. start = 1
  51. }
  52. t.Args = append(t.Args, args[start:]...)
  53. }
  54. return t
  55. }
  56. func (t *T) AddTask() {
  57. t.Lock()
  58. defer t.Unlock()
  59. if len(t.ch) == 1 {
  60. // 代表已经有任务了
  61. // 直接丢弃这次任务
  62. return
  63. }
  64. t.ch <- struct{}{}
  65. }
  66. func (t *T) RunTask() {
  67. // 先run服务
  68. err := t.Run()
  69. if err != nil {
  70. return
  71. }
  72. for {
  73. _, ok := <-t.ch
  74. if !ok {
  75. return
  76. }
  77. // todo 执行任务
  78. // 先编译新的文件 然后 kill 然后执行
  79. fmt.Println(kill(t.Cmd.Process.Pid))
  80. err = t.Run()
  81. if err != nil {
  82. fmt.Println(err)
  83. return
  84. }
  85. }
  86. }
  87. // kill:
  88. func kill(pid int) error {
  89. p, err := os.FindProcess(pid)
  90. if err != nil {
  91. return err
  92. }
  93. return p.Kill()
  94. }