我想检查PID是否正在运行(即存在并且没有被僵尸)。
从/proc/$PID/stat
开始很快,但我想要更便携的东西。
我现在最好的是:
( STAT="$(ps -ostat= -p$PID)"; test "$STAT" -a "$STAT" "!=" "Z" )
这似乎适用于BSD和Linux。还有更好的方法吗?
答案 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'。