process.go

 1package process
 2
 3import (
 4	"os"
 5	"syscall"
 6)
 7
 8// IsRunning tell is a process is running
 9func IsRunning(pid int) bool {
10	// never return no error in a unix system
11	process, err := os.FindProcess(pid)
12	if err != nil {
13		return false
14	}
15
16	// Signal 0 doesn't do anything but allow testing the process
17	err = process.Signal(syscall.Signal(0))
18	if err == nil {
19		return true
20	}
21	if err.Error() == "os: process already finished" {
22		return false
23	}
24	if errno, ok := err.(syscall.Errno); ok {
25		switch errno {
26		case syscall.ESRCH:
27			return false
28		case syscall.EPERM:
29			return true
30		}
31	}
32	return false
33}