25

我想检查一个 PID 是否正在运行(即存在并且没有僵尸)。

这样做真的很快,/proc/$PID/stat但我想要更便携的东西。

我现在最好的是:

( STAT="$(ps -ostat= -p$PID)"; test "$STAT" -a "$STAT" "!=" "Z" )

这似乎适用于 BSD 和 Linux。有没有更好的办法?

4

2 回答 2

1

希望 POSIX 兼容。用破折号测试。要使用它,请使用您喜欢的编辑器保存它,使其可执行(chmod 755 foo.sh),然后使用 PID 参数运行它。

当然,您可以根据需要进行调整。

#!/bin/sh
pid="$1";
psout=$(ps -o s= -p "$pid");
pattern='[SRDTWX]';

case "$psout" in 
    $pattern) echo "Not a zombie";;
    Z) echo "Zombie found";;
    *) echo "Incorrect input";; 
esac
于 2015-05-21T19:07:39.903 回答
0

恕我直言,解析“ps”的输出是最便携的方式。所有的 'ps' 变体在语法上都有一点不同,但整体输出足够好:

#!/bin/sh

process_show()
{
  ps
  ps ax
}

pid_is_zombie()
{
  pid="$1"

  process_show | while read -r LINE; do
    # e.g.: 31446 pts/7    R+     0:00 ps ax
    set -f
    set +f -- $LINE

    test "$1" = "$pid" || continue
    case "$3" in *'Z'*) return 0;; esac
  done

  return 1
}

pid_is_zombie 123 && echo "yes it is"

甚至 'ps ax' 也不是无处不在,所以我们必须尝试 'ps' 和 'ps ax'。

于 2015-11-25T20:02:42.533 回答