我想检查一个 PID 是否正在运行(即存在并且没有僵尸)。
这样做真的很快,/proc/$PID/stat
但我想要更便携的东西。
我现在最好的是:
( STAT="$(ps -ostat= -p$PID)"; test "$STAT" -a "$STAT" "!=" "Z" )
这似乎适用于 BSD 和 Linux。有没有更好的办法?
希望 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
恕我直言,解析“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'。