Подтвердить что ты не робот

Портативное решение оболочки для проверки того, является ли PID зомбированным

Я хочу проверить, работает ли PID (т.е. существует и не зомбирован).

Это действительно быстро сделать из /proc/$PID/stat, но я бы хотел что-то более портативное.

Самое лучшее, что у меня есть сейчас:

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

Что, похоже, работает на BSD и Linux. Есть ли лучший способ?

4b9b3361

Ответ 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".