Портативное решение оболочки для проверки того, является ли PID зомбированным
Я хочу проверить, работает ли PID (т.е. существует и не зомбирован).
Это действительно быстро сделать из /proc/$PID/stat
, но я бы хотел что-то более портативное.
Самое лучшее, что у меня есть сейчас:
( STAT="$(ps -ostat= -p$PID)"; test "$STAT" -a "$STAT" "!=" "Z" )
Что, похоже, работает на BSD и Linux. Есть ли лучший способ?
Ответы
Ответ 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
Ответ 2
ИМХО синтаксический анализ вывода "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".