2010-02-04 44 views
6

Estoy tratando de verificar si un proceso se está ejecutando. Si se está ejecutando, quiero un valor de retorno de 'OK' y si no es un valor de retorno 'No OK'. Solo puedo usar 'ps' sin ningún otro argumento adjunto (por ej., Ps -ef) si ese es el término correcto. El código que tengo es:Comprobar si el proceso se está ejecutando

if ps | grep file; then echo 'OK'; else echo 'NO'; fi 

El problema con esto es que no busca el proceso exacto y siempre devuelve 'OK', no quiero que toda la información que aparezca sólo quiero saber si el archivo existe o no

Respuesta

10

Su código siempre devuelve 'OK', porque grep se encuentra en la lista de procesos ('grep file' contiene la palabra 'file'). Una solución sería hacer un `grep -e [f] ile '(-e para la expresión regular), que no se encuentra a sí mismo.

2
ps | grep -q '[f]ile' 
6

repuesto grep para los problemas reales:

ps -C file 

evita el problema de usar grep por completo.

-1

Hay una solución con grep así:

if [ "$(ps aux | grep "what you need" | awk '{print $11}')" == "grep" ]; then 
... 
elif [ ... ]; then 
... 
else 
... 
fi 

Esto funciona bien en Debian 6, no está seguro acerca de otras distribuciones. '{print $11}' es necesario, porque el sistema trata a grep como un proceso también.

1

Cuando sé que el pid Prefiero:

[ -d /proc/<pid> ] && echo OK || echo NO 
0
if ps | grep file | grep -v grep; 
then echo 'ok'; 
else echo 'no'; 

grep -v grep se asegura de que el resultado que se obtiene no es la declaración grep en la ejecución.

1

¿Qué pasa con "pgrep"?

$ pgrep -x foo 
xxxx 
$ 

donde xxxx es el pid del binario que se ejecuta con el nombre foo. Si foo no se está ejecutando, entonces no hay salida.

también:

$ si [[pgrep -x foo]]; luego repite "sí"; else echo "no"; fi;

se imprimirá "sí" si foo se está ejecutando; "no" si no.

ver la página man de pgrep.

Cuestiones relacionadas