用于检查PID是否被僵尸的便携式shell解决方案

时间:2013-09-19 19:09:41

标签: shell unix sh pid

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

/proc/$PID/stat开始很快,但我想要更便携的东西。

我现在最好的是:

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

这似乎适用于BSD和Linux。还有更好的方法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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'。