zhangmeng
2019-12-17 c2ced9eaa6a8f174866ecbdb77d7ce7b02bb969c
proc/reaper.go
@@ -10,14 +10,19 @@
   "time"
)
type procInfo struct {
   cmd *exec.Cmd
   env string
}
var (
   procMap = make(map[int]*exec.Cmd)
   procMap = make(map[int]*procInfo)
)
func restartProc(ctxt context.Context, pid int) {
   cmd, ok := procMap[pid]
   info, ok := procMap[pid]
   if ok {
      err := cmd.Wait()
      err := info.cmd.Wait()
      if err != nil {
         logo.Errorln("pid : [", pid, "] quit error: ", err)
@@ -25,32 +30,35 @@
         logo.Infoln("pid : [", pid, "] quit")
      }
      delete(procMap, pid)
      runProc(ctxt, cmd.Path, cmd.Args[1:])
      runProc(ctxt, info.cmd.Path, info.cmd.Args[1:], &info.env)
   } else {
      logo.Errorln(pid, " doesn't exist")
   }
}
func quitProc(pid int) {
   cmd, ok := procMap[pid]
   info, ok := procMap[pid]
   if ok {
      delete(procMap, pid)
      syscall.Kill(pid, syscall.SIGINT)
      cmd.Wait()
      info.cmd.Wait()
   } else {
      logo.Errorln(pid, " doesn't exist")
   }
}
func runProc(ctxt context.Context, bin string, args []string) (int, error) {
func runProc(ctxt context.Context, bin string, args []string, env *string) (int, error) {
   cmd := exec.CommandContext(ctxt, bin, args...)
   cmd.Env = os.Environ()
   cmd.Env = append(cmd.Env, *env)
   pid := -1
   cmd.Stdout = os.Stdout
   cmd.Stderr = os.Stderr
   err := cmd.Start()
   if err == nil {
      pid = cmd.Process.Pid
      procMap[pid] = cmd
      procMap[pid] = &procInfo{cmd, *env}
   }
   return pid, err
}