En general, es una mala idea probar el enfoque simple ps
e grep
intentar determinar si se está ejecutando un proceso determinado.
Sería mucho mejor usarlo pgrep
para esto:
if pgrep "varnish" >/dev/null; then
echo "Varnish in running"
else
echo "Varnish is not running"
fi
Vea el manual para pgrep
. En algunos sistemas (probablemente no en Linux), se obtiene un -q
indicador que corresponde al mismo indicador para el grep
cual se elimina la necesidad de redirigir /dev/null
. También hay una -f
bandera que realiza la coincidencia en la línea de comando completa en lugar de solo en el nombre del proceso. También se puede limitar la coincidencia a los procesos que pertenecen a un usuario específico -u
.
La instalación pgrep
también le da acceso a lo pkill
que le permite señalar procesos basados en sus nombres.
Además, si este es un demonio de servicio , y si su sistema Unix tiene una forma de consultar información (por ejemplo, si está en funcionamiento o no), entonces esa es la forma correcta de verificarlo.
En Linux, tiene systemctl
( systemctl is-active --quiet varnish
devolverá 0 si se está ejecutando, 3 de lo contrario), en OpenBSD que tiene rcctl
, etc.
Ahora a tu guión:
En su secuencia de comandos, analiza la salida de ps ax
. Esta salida contendrá el nombre del script en sí check_varnish_pro.sh
, que obviamente contiene la cadena varnish
. Esto te da un falso positivo. Habría descubierto esto si lo hubiera ejecutado sin la -q
bandera durante la grep
prueba.
#!/bin/bash
ps ax | grep '[v]arnish'
Ejecutándolo:
$ ./check_varnish_pro.sh
31004 p1 SN+ 0:00.04 /bin/bash ./check_varnish_pro.sh
Otro problema es que aunque intenta "ocultar" el grep
proceso para que no sea detectado por grep
sí mismo mediante el uso [v]
del patrón. Ese enfoque fallará si ejecuta el script o la línea de comando en un directorio que tiene un archivo o directorio nombrado varnish
en él (en cuyo caso obtendrá un falso positivo, de nuevo). Esto se debe a que el patrón no está entre comillas y el shell realizará el bloqueo de nombre de archivo con él.
Ver:
bash-4.4$ set -x
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep '[v]arnish'
bash-4.4$ touch varnish
+ touch varnish
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep varnish
91829 p2 SN+p 0:00.02 grep varnish
La presencia del archivo varnish
hará que el shell se reemplace [v]arnish
con el nombre del archivo varnish
y obtendrá un golpe en el patrón en la tabla de procesos (el grep
proceso).