diff --git a/util/process/process.go b/util/process/process.go index f3bcb7f2..e3f47282 100644 --- a/util/process/process.go +++ b/util/process/process.go @@ -9,15 +9,25 @@ import ( func IsRunning(pid int) bool { // never return no error in a unix system process, err := os.FindProcess(pid) - if err != nil { return false } // Signal 0 doesn't do anything but allow testing the process err = process.Signal(syscall.Signal(0)) - - // Todo: distinguish "you don't have access" and "process doesn't exist" - - return err == nil + if err == nil { + return true + } + if err.Error() == "os: process already finished" { + return false + } + if errno, ok := err.(syscall.Errno); ok { + switch errno { + case syscall.ESRCH: + return false + case syscall.EPERM: + return true + } + } + return false }