manager.go 835 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package process
  2. import (
  3. "os"
  4. "os/exec"
  5. "os/signal"
  6. "sync"
  7. "syscall"
  8. )
  9. var (
  10. subprocesses map[int]*exec.Cmd
  11. l *sync.Mutex
  12. )
  13. func Init() {
  14. subprocesses = make(map[int]*exec.Cmd)
  15. l = &sync.Mutex{}
  16. sig := make(chan os.Signal, 1)
  17. signal.Notify(sig, os.Interrupt, syscall.SIGTERM)
  18. go func() {
  19. <-sig
  20. TerminateAll()
  21. os.Exit(0)
  22. }()
  23. }
  24. func WrapProcess(cmd *exec.Cmd) {
  25. cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
  26. }
  27. func NewProcess(cmd *exec.Cmd) {
  28. l.Lock()
  29. defer l.Unlock()
  30. subprocesses[cmd.Process.Pid] = cmd
  31. }
  32. func RemoveProcess(cmd *exec.Cmd) {
  33. l.Lock()
  34. defer l.Unlock()
  35. delete(subprocesses, cmd.Process.Pid)
  36. }
  37. func TerminateAll() {
  38. l.Lock()
  39. defer l.Unlock()
  40. for _, cmd := range subprocesses {
  41. if cmd.Process != nil {
  42. syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL)
  43. }
  44. }
  45. }