Ogólnie rzecz biorąc, złym pomysłem jest wypróbowanie prostego podejścia ps
i grep
próba ustalenia, czy dany proces działa.
Lepiej byłoby użyć pgrep
do tego:
if pgrep "varnish" >/dev/null; then
echo "Varnish in running"
else
echo "Varnish is not running"
fi
Zobacz instrukcję dla pgrep
. W niektórych systemach (prawdopodobnie nie w Linuksie) otrzymujesz -q
flagę odpowiadającą tej samej fladze, dla grep
której pozbywasz się potrzeby przekierowywania /dev/null
. Istnieje również -f
flaga, która wykonuje dopasowanie w pełnym wierszu poleceń, a nie tylko w nazwie procesu. Można również ograniczyć dopasowanie do procesów należących do konkretnego użytkownika -u
.
Instalowanie pgrep
daje również dostęp do tego, pkill
co pozwala sygnalizować procesy na podstawie ich nazw.
Ponadto, jeśli jest to demon usługi i jeśli twój system uniksowy ma sposób na zapytanie go o informacje (np. Czy jest uruchomiony, czy nie), to jest to właściwy sposób sprawdzania go.
W systemie Linux masz systemctl
( systemctl is-active --quiet varnish
zwróci 0, jeśli jest uruchomiony, 3 w przeciwnym razie), w OpenBSD masz rcctl
itp.
Teraz do skryptu:
W skrypcie analizujesz dane wyjściowe z ps ax
. Dane wyjściowe będą zawierać nazwę samego skryptu check_varnish_pro.sh
, który oczywiście zawiera ciąg varnish
. To daje fałszywie pozytywny wynik. Zauważyłbyś to, gdybyś testował go bez -q
flagi grep
.
#!/bin/bash
ps ax | grep '[v]arnish'
Uruchamianie:
$ ./check_varnish_pro.sh
31004 p1 SN+ 0:00.04 /bin/bash ./check_varnish_pro.sh
Innym problemem jest to, że chociaż próbujesz „ukryć” sam grep
proces przed wykryciem grep
za pomocą [v]
wzorca. Takie podejście zakończy się niepowodzeniem, jeśli zdarzy się, że uruchomisz skrypt lub wiersz poleceń w katalogu, w którym znajduje się nazwa pliku lub katalogu varnish
(w takim przypadku ponownie otrzymasz fałszywy wynik dodatni). Wynika to z faktu, że wzorzec nie jest cytowany, a powłoka będzie wykonywać z nim globbing nazw plików.
Widzieć:
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
Obecność pliku varnish
spowoduje, że powłoka zastąpi [v]arnish
nazwę pliku varnish
i otrzymasz trafienie we wzorzec w tabeli procesów ( grep
proces).