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}