In generale, è una cattiva idea provare l'approccio semplice ps
e grep
provare a determinare se un determinato processo è in esecuzione.
Sarebbe molto meglio usare pgrep
per questo:
if pgrep "varnish" >/dev/null; then
echo "Varnish in running"
else
echo "Varnish is not running"
fi
Vedere il manuale di pgrep
. Su alcuni sistemi (probabilmente non su Linux), ottieni un -q
flag che corrisponde allo stesso flag per il grep
quale elimina la necessità di reindirizzare /dev/null
. C'è anche un -f
flag che esegue la corrispondenza sulla riga di comando completa anziché solo sul nome del processo. Si può anche limitare la corrispondenza ai processi appartenenti a un utente specifico che utilizza -u
.
L'installazione pgrep
ti dà anche accesso a ciò pkill
che ti consente di segnalare i processi in base al loro nome.
Inoltre, se questo è un demone di servizio e se il tuo sistema Unix ha un modo per interrogarlo per informazioni (ad esempio, se è attivo e funzionante o meno), allora questo è il modo corretto di controllarlo.
Su Linux, hai systemctl
( systemctl is-active --quiet varnish
restituirà 0 se è in esecuzione, 3 altrimenti), su OpenBSD hai rcctl
, ecc.
Ora alla tua sceneggiatura:
Nel tuo script, analizzi l'output di ps ax
. Questo output conterrà il nome dello script stesso check_varnish_pro.sh
, che ovviamente contiene la stringa varnish
. Questo ti dà un falso positivo. Lo avresti notato se lo avessi eseguito senza la -q
bandiera grep
durante il test.
#!/bin/bash
ps ax | grep '[v]arnish'
Eseguendolo:
$ ./check_varnish_pro.sh
31004 p1 SN+ 0:00.04 /bin/bash ./check_varnish_pro.sh
Un altro problema è che sebbene si provi a "nascondere" il grep
processo dall'essere rilevato da grep
solo usando [v]
nel modello. Questo approccio fallirà se ti capita di eseguire lo script o la riga di comando in una directory in cui è presente un file o una directory varnish
(nel qual caso otterrai di nuovo un falso positivo). Questo perché il modello non è quotato e la shell eseguirà il nome del file in esso.
Vedere:
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 presenza del file varnish
farà sì che la shell si sostituisca [v]arnish
con il nome del file varnish
e si otterrà un hit sul modello nella tabella del grep
processo (il processo).