process_unix.go 946 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. //go:build linux || freebsd || darwin
  2. // +build linux freebsd darwin
  3. package system // import "github.com/docker/docker/pkg/system"
  4. import (
  5. "bytes"
  6. "fmt"
  7. "os"
  8. "golang.org/x/sys/unix"
  9. )
  10. // IsProcessAlive returns true if process with a given pid is running.
  11. func IsProcessAlive(pid int) bool {
  12. err := unix.Kill(pid, 0)
  13. if err == nil || err == unix.EPERM {
  14. return true
  15. }
  16. return false
  17. }
  18. // KillProcess force-stops a process.
  19. func KillProcess(pid int) {
  20. unix.Kill(pid, unix.SIGKILL)
  21. }
  22. // IsProcessZombie return true if process has a state with "Z"
  23. // http://man7.org/linux/man-pages/man5/proc.5.html
  24. func IsProcessZombie(pid int) (bool, error) {
  25. data, err := os.ReadFile(fmt.Sprintf("/proc/%d/stat", pid))
  26. if err != nil {
  27. if os.IsNotExist(err) {
  28. return false, nil
  29. }
  30. return false, err
  31. }
  32. if cols := bytes.SplitN(data, []byte(" "), 4); len(cols) >= 3 && string(cols[2]) == "Z" {
  33. return true, nil
  34. }
  35. return false, nil
  36. }