En général, c'est une mauvaise idée d'essayer l'approche simple avec ps
et grep
d'essayer de déterminer si un processus donné est en cours d'exécution.
Vous feriez bien mieux d'utiliser pgrep
pour cela:
if pgrep "varnish" >/dev/null; then
echo "Varnish in running"
else
echo "Varnish is not running"
fi
Voir le manuel pour pgrep
. Sur certains systèmes (probablement pas sous Linux), vous obtenez un -q
indicateur qui correspond au même indicateur pour grep
lequel vous vous débarrassez de la nécessité de rediriger /dev/null
. Il existe également un -f
indicateur qui effectue la correspondance sur la ligne de commande complète plutôt que sur le nom du processus uniquement. On peut également limiter la correspondance aux processus appartenant à un utilisateur spécifique utilisant -u
.
L'installation pgrep
vous donne également accès à pkill
ce qui vous permet de signaler des processus en fonction de leurs noms.
De plus, s'il s'agit d'un démon de service et si votre système Unix a un moyen de l'interroger pour obtenir des informations (par exemple, s'il est opérationnel et non), alors c'est la bonne façon de le vérifier.
Sous Linux, vous avez systemctl
( systemctl is-active --quiet varnish
retournera 0 s'il est en cours d'exécution, 3 sinon), sur OpenBSD vous avez rcctl
, etc.
Passons maintenant à votre script:
Dans votre script, vous analysez la sortie de ps ax
. Cette sortie contiendra le nom du script lui-même check_varnish_pro.sh
, qui contient évidemment la chaîne varnish
. Cela vous donne un faux positif. Vous l'auriez repéré si vous l'aviez exécuté sans -q
indicateur grep
pendant le test.
#!/bin/bash
ps ax | grep '[v]arnish'
L'exécuter:
$ ./check_varnish_pro.sh
31004 p1 SN+ 0:00.04 /bin/bash ./check_varnish_pro.sh
Un autre problème est que, même si vous essayez de «masquer» le grep
processus d'être détecté par grep
lui-même en utilisant [v]
le modèle. Cette approche échouera si vous exécutez le script ou la ligne de commande dans un répertoire contenant un fichier ou un répertoire nommé varnish
(auquel cas vous obtiendrez à nouveau un faux positif). Cela est dû au fait que le modèle n'est pas entre guillemets et que le shell effectuera la globalisation des noms de fichiers avec lui.
Voir:
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 présence du fichier varnish
entraînera le remplacement du shell [v]arnish
par le nom de fichier varnish
et vous obtenez un hit sur le modèle dans la table de processus (le grep
processus).