
Estoy usando RHEL 7.5 y tengo un programa Java que incluye un archivo con el número PID. Si el proceso se mata, el archivo todavía existe y estoy haciendo un script para validar si el PID que está almacenado en ese archivo está vivo o no, pero tengo una duda o un problema.
El PID 445 existe y el 2445 existe. Entonces, ¿cómo puedo obtener sólo el 445?
Lo intenté con el siguiente comando:
ps -ax | egrep "^ 445"
Pero no devolvió nada.
Los dos procesos:
ps -ax | grep -v grep | egrep "445"
445 pts/2 Sl 3:50 /opt/
2445 ? S 0:00 dbus-launch
Respuesta1
Usar -p
:
-p proclist
Escriba información para procesos cuyos números de identificación de proceso se proporcionan enproclist
. […]
(fuente)
En tu caso:
ps -p 445
POSIX dice ps
que debería devolver un estado de salida positivo si "ocurrió un error". Cada uno de ps
los que probé considera proclist
que no contiene al menos un PID de unexistenteproceso como "erróneo". Esto es útil. Ejemplo:
ps -p 445 >/dev/null && echo "Process exists."
Notas:
- Los PID de procesos terminados pueden o serán reutilizados eventualmente, por lo que incluso si el PID está en uso, es posible que no sea el proceso que le interesa.
- Si el PID en el archivo proviene de antes del (re)arranque reciente, el proceso obviamente ya no existe, incluso si el PID ahora está en uso. (Pista:configurar el programa para que el archivo esté activado
tmpfs
).
Respuesta2
Puede verificar si un proceso se está ejecutando en scripts Bash usando kill -0
así:
if [ -f ${pid_file} ] && kill -0 $(cat ${pid_file}) 2>/dev/null; then
exit
else
rm -rf ${pid_file}
exit
fi
Equivale ${pid_file}
a la ruta del archivo con el PID. Comprueba -f ${pid_file}
si el archivo PID existe. Luego kill -0 $(cat ${pid_file})
comprueba si el proceso se está ejecutando.
Lo que se reduce a:
- Si el proceso se está ejecutando, no haga más que salir del script.
- De lo contrario (si el proceso esnoejecutándose, simplemente elimine el archivo PID.
La magia del kill -0
se explica en la página de manual dekill
:
Sifirmares 0, entonces no se envía ninguna señal, pero aún se realiza la verificación de errores; esto se puede utilizar para comprobar la existencia de un ID de proceso o un ID de grupo de procesos.