123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- //go:build linux || freebsd || darwin
- // +build linux freebsd darwin
- package system // import "github.com/docker/docker/pkg/system"
- import (
- "fmt"
- "os"
- "strings"
- "golang.org/x/sys/unix"
- )
- // IsProcessAlive returns true if process with a given pid is running.
- func IsProcessAlive(pid int) bool {
- err := unix.Kill(pid, 0)
- if err == nil || err == unix.EPERM {
- return true
- }
- return false
- }
- // KillProcess force-stops a process.
- func KillProcess(pid int) {
- unix.Kill(pid, unix.SIGKILL)
- }
- // IsProcessZombie return true if process has a state with "Z"
- // http://man7.org/linux/man-pages/man5/proc.5.html
- func IsProcessZombie(pid int) (bool, error) {
- statPath := fmt.Sprintf("/proc/%d/stat", pid)
- dataBytes, err := os.ReadFile(statPath)
- if err != nil {
- // TODO(thaJeztah) should we ignore os.IsNotExist() here? ("/proc/<pid>/stat" will be gone if the process exited)
- return false, err
- }
- data := string(dataBytes)
- sdata := strings.SplitN(data, " ", 4)
- if len(sdata) >= 3 && sdata[2] == "Z" {
- return true, nil
- }
- return false, nil
- }
|