Em geral, é uma má idéia tentar a abordagem simples ps
e grep
determinar se um determinado processo está em execução.
Você ficaria muito melhor usando pgrep
isso:
if pgrep "varnish" >/dev/null; then
echo "Varnish in running"
else
echo "Varnish is not running"
fi
Veja o manual para pgrep
. Em alguns sistemas (provavelmente não no Linux), você recebe um -q
sinalizador que corresponde ao mesmo sinalizador para o grep
qual se livra da necessidade de redirecionar /dev/null
. Há também um -f
sinalizador que executa a correspondência na linha de comando completa, e não apenas no nome do processo. Pode-se também limitar a correspondência aos processos pertencentes a um usuário específico usando -u
.
A instalação pgrep
também fornece acesso ao pkill
que permite sinalizar processos com base em seus nomes.
Além disso, se este é um daemon de serviço , e se o seu sistema Unix tem uma maneira de consultá-lo para obter informações (por exemplo, se ele está funcionando ou não), essa é a maneira correta de verificar isso.
No Linux, você possui systemctl
( systemctl is-active --quiet varnish
retornará 0 se estiver em execução, 3 caso contrário), no OpenBSD rcctl
, etc.
Agora para o seu script:
No seu script, você analisa a saída de ps ax
. Esta saída conterá o nome do próprio script check_varnish_pro.sh
, que obviamente contém a string varnish
. Isso lhe dá um falso positivo. Você teria percebido isso se o tivesse executado sem o -q
sinalizador grep
durante o teste.
#!/bin/bash
ps ax | grep '[v]arnish'
Executando:
$ ./check_varnish_pro.sh
31004 p1 SN+ 0:00.04 /bin/bash ./check_varnish_pro.sh
Outro problema é que, embora você tente "ocultar" o grep
processo de ser detectado por grep
si mesmo usando [v]
o padrão. Essa abordagem falhará se você executar o script ou a linha de comando em um diretório que contenha um arquivo ou diretório varnish
(nesse caso, você receberá um falso positivo novamente). Isso ocorre porque o padrão não está entre aspas e o shell executará o nome do arquivo globbing com ele.
Vejo:
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
A presença do arquivo varnish
fará com que o shell seja substituído [v]arnish
pelo nome do arquivo varnish
e você receberá um hit no padrão na tabela de processos (o grep
processo).