Tentando escrever um script de shell que continua testando meu servidor e me enviando um e-mail quando ele ficar inativo.
O problema é que, quando eu saio da conexão ssh, apesar de executá-la &
no final do comando ./stest01.sh &
, ele automaticamente cai em outro lugar e continua me enviando ininterruptamente, até que eu faça o logon novamente e o mate.
#!/bin/bash
while true; do
date > sdown.txt ;
cp /dev/null pingop.txt ;
ping -i 1 -c 1 -W 1 myserver.net > pingop.txt &
sleep 1 ;
if
grep "64 bytes" pingop.txt ;
then
:
else
mutt -s "Server Down!" myemail@address.com < sdown.txt ;
sleep 10 ;
fi
done
linux
shell-script
grep
ping
Vasconcelos1914
fonte
fonte
:
faz? Não faria sentido para mim que fosse um ponto e vírgula;
...:
não faz nada. É para isso que ele foi projetado para fazer. Aqui, em vez de inverter o teste, eles o usam para fazer uma operação não anteselse
.Respostas:
Quando o GNU
grep
tenta gravar seu resultado, ele falhará com um status de saída diferente de zero, porque não tem onde gravar a saída, porque a conexão SSH se foi.Isso significa que a
if
declaração está sempre assumindo oelse
ramo.Para ilustrar isso (isso não é exatamente o que está acontecendo no seu caso, mas mostra o que acontece se o GNU
grep
não conseguir gravar sua saída):Aqui, procuramos
grep
a string queecho
produz, mas fechamos os dois fluxos de saída paragrep
que ele não possa gravar em nenhum lugar. Como você pode ver, o status de saída do GNUgrep
é 2 em vez de 0.Isso é particular do GNU
grep
,grep
nos sistemas BSD não se comportará da mesma maneira:Para remediar isso, verifique se o script não gera saída. Você pode fazer isso com
exec >/dev/null 2>&1
. Além disso, devemos usargrep
com essa-q
opção, pois não estamos interessados em ver a saída dele (isso geralmente também acelera o processogrep
, pois não precisa analisar o arquivo inteiro, mas, nesse caso, faz muito pouco diferença de velocidade, já que o arquivo é muito pequeno).Em resumo:
Você também pode usar um teste
ping
diretamente, removendo a necessidade de um dos arquivos intermediários (e também se livrando do outro arquivo intermediário que realmente contém apenas um carimbo de data):Nas duas variações do script acima, optei por sair do loop quando não alcançava o host, apenas para minimizar o número de emails enviados. Em vez disso, você pode substituir
break
por, por exemplo,sleep 10m
ou algo assim, se espera que o servidor volte a aparecer novamente.Também ajustei levemente as opções usadas,
ping
pois-i 1
não faz muito sentido-c 1
.Menor (a menos que você queira continuar enviando e-mails quando o host estiver inacessível):
Como um trabalho cron executado a cada minuto (continuaria enviando e-mails a cada minuto se o servidor continuar inativo):
fonte
>&-
fechará o fd (como em, o descritor de arquivo 1 está fechado), enquanto o fechamento da conexão SSH terá um efeito diferente (um descritor de arquivo ainda estará presente, mas não conectado a nada do outro lado.) Acho que o ponto ainda permanece, o GNU grep sai diferente de zero se tentar gravar a saída e isso falhar. Sim, a melhor solução é apenas verificar o status de saída do ping diretamente.exec </dev/null >/dev/null 2>&1
próximo ao início. Dessa forma, se, por exemplo,ping
decidir escrever algo para stderr, isso não causará problemas./dev/null
daqui, mas resolvi a saída. Obrigado pela sugestão.