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  }