package process import ( "github.com/crawlab-team/crawlab/trace" "os/exec" "regexp" "runtime" "strings" ) var pidRegexp, _ = regexp.Compile("(?:^|\\s+)\\d+(?:$|\\s+)") func ProcessIdExists(id int) (ok bool) { lines, err := ListProcess(string(rune(id))) if err != nil { return false } for _, line := range lines { matched := pidRegexp.MatchString(line) if matched { return true } } return false } func ListProcess(text string) (lines []string, err error) { if runtime.GOOS == "windows" { return listProcessWindow(text) } else { return listProcessLinuxMac(text) } } func listProcessWindow(text string) (lines []string, err error) { cmd := exec.Command("tasklist", "/fi", text) out, err := cmd.CombinedOutput() _, ok := err.(*exec.ExitError) if !ok { return nil, trace.TraceError(err) } lines = strings.Split(string(out), "\n") return lines, nil } func listProcessLinuxMac(text string) (lines []string, err error) { cmd := exec.Command("ps", "aux") out, err := cmd.CombinedOutput() _, ok := err.(*exec.ExitError) if !ok { return nil, trace.TraceError(err) } _lines := strings.Split(string(out), "\n") for _, l := range _lines { if strings.Contains(l, text) { lines = append(lines, l) } } return lines, nil }