github.com/TrueBlocks/trueblocks-core/src/apps/chifra@v0.0.0-20241022031540-b362680128f7/pkg/utils/pid_exists.go (about) 1 package utils 2 3 import ( 4 "fmt" 5 "os" 6 "syscall" 7 ) 8 9 func PidExists(pid int64) (bool, error) { 10 if pid <= 0 { 11 return false, fmt.Errorf("invalid pid %v", pid) 12 } 13 proc, err := os.FindProcess(int(pid)) 14 if err != nil { 15 return false, err 16 } 17 err = proc.Signal(syscall.Signal(0)) 18 if err == nil { 19 return true, nil 20 } 21 if err.Error() == "os: process already finished" { 22 return false, nil 23 } 24 errno, ok := err.(syscall.Errno) 25 if !ok { 26 return false, err 27 } 28 switch errno { 29 case syscall.ESRCH: 30 return false, nil 31 case syscall.EPERM: 32 return true, nil 33 } 34 return false, err 35 }