| | |
| | | "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) |
| | |
| | | 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 |
| | | } |