Solución de shell portátil para comprobar si PID es zombie
unix (2)
En mi humilde opinión, analizar la salida de ''ps'' es la forma más portátil. toda la variante ''ps'' por ahí difiere un poco en la sintaxis, pero la salida general es lo suficientemente buena:
#!/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"
incluso ''ps ax'' no es posible en todas partes, así que debemos probar ''ps'' y ''ps ax''.
Quiero comprobar si se está ejecutando un PID (es decir, existe y no es un zombi).
Es muy rápido hacerlo desde /proc/$PID/stat
pero me gustaría algo más portátil.
Lo mejor que tengo ahora es:
( STAT="$(ps -ostat= -p$PID)"; test "$STAT" -a "$STAT" "!=" "Z" )
Lo que parece funcionar en BSD y Linux. ¿Hay alguna manera mejor?
Esperemos que sea compatible con POSIX. Probado con guión. Para usarlo, guárdelo con su editor favorito, chmod 755 foo.sh
en ejecutable ( chmod 755 foo.sh
) y ejecútelo con un argumento PID.
Por supuesto que puedes adaptarlo según sea necesario.
#!/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