Estou trabalhando em um projeto no qual preciso fazer uma chamada de url para um dos meus servidores a partir do script de shell bash.
http://hostname.domain.com:8080/beat
Depois de atingir o URL acima, receberei a resposta abaixo, que preciso analisar e extrair o valor de syncs
e syncs_behind
state: READY process: 30 process_behind: 100 num_rounds: 60 hour_col: 2 day_col: 0 oldest_day_col: 0
Agora preciso acertar o URL acima a cada 10 segundos por um período de 10 minutos e extrair o valor de process
e process_behind
dele e usá-lo para validá-lo com as condições abaixo -
process > 8
process_behind = 0
se o sync for maior que 8 e process_behind = 0, então terminarei meu shell script com alguma mensagem dizendo - "Dados foram validados", caso contrário eu continuaria tentando por 10 minutos. Se nesse 10 Minute window, a condição acima não foi encontrada. Eu terminarei o shell script de qualquer forma, o que significa que não vou tentar novamente.
Abaixo está meu script de shell que faz a coisa acima e funciona bem em condições normais quando o servidor está ativo.
#!/bin/bash
COUNT=60 #number of 10 second timeouts in 10 minutes
while [[ $COUNT -ge "0" ]]; do
#send the request, put response in variable
DATA=$(wget -O - -q -t 1 http://hostname.domain.com:8080/beat)
#grep $DATA for process and process_behind
PROCESS=$(echo $DATA | grep -oE 'process: [0-9]+' | awk '{print $2}')
PROCESS_BEHIND=$(echo $DATA | grep -oE 'process_behind: [0-9]+' | awk '{print $2}')
echo $PROCESS
echo $PROCESS_BEHIND
#verify conditionals
if [[ $PROCESS -gt "8" && $PROCESS_BEHIND -eq "0" ]]; then exit 0; fi
#decrement the counter
let COUNT-=1
#wait another 10 seconds
sleep 10
done
Pode haver um cenário no qual ele falhe, suponha que, se o servidor estiver inoperante, então wget
line lançará uma exceção.
Agora, o que estou tentando fazer é: se o servidor estiver inativo, durmo por 30 segundos e, em seguida, tento executar novamente a URL do servidor e, se ela falhar novamente, aguento novamente por 30 segundos e, em seguida, tento executar a URL do servidor novamente. Vou repetir a execução da URL do servidor por n vezes, digamos que n seja 10.
Depois disso, o servidor ainda não está ativo. Eu sairei do shell script com status diferente de zero e um servidor de mensagens estará inativo. Mas se o servidor estiver ativo e eu puder recuperar a resposta, vou avançar para extrair os campos que tenho em meu script de shell posterior.
É possível implementar o mecanismo de repetição no script de shell bash? Ou há alguma maneira melhor de fazer isso além do wget?
UPDATE 1: -
Isso é o que eu tenho -
#!/bin/bash
COUNT=60 #number of 10 second timeouts in 10 minutes
DATA=""
RETRY=10
while [[ $COUNT -ge "0" ]]; do
while [ $RETRY -gt 0 ]
do
#send the request, put response in variable
DATA=$(wget -O - -q -t 1 http://machineA:8080/beat)
echo "Hello"
if [ $? -eq 0 ]
then
break
else
let RETRY-=1
sleep 30
fi
done
if [ $RETRY -eq 0 ]
then
exit 2
fi
#grep $DATA for process and process_behind
PROCESS=$(echo $DATA | grep -oE 'process: [0-9]+' | awk '{print $2}')
PROCESS_BEHIND=$(echo $DATA | grep -oE 'process_behind: [0-9]+' | awk '{print $2}')
echo $PROCESS
echo $PROCESS_BEHIND
#verify conditionals
if [[ $PROCESS -gt "8" && $PROCESS_BEHIND -eq "0" ]]; then exit 0; fi
#decrement the counter
let COUNT-=1
#wait another 10 seconds
sleep 10
done
Se meu servidor estiver inoperante e eu estiver executando o script de shell acima, ele estará imprimindo "Hello" no console e funcionará bem. Mas veja minha atualização abaixo -
Atualização 2: -
Ok, agora eu encontrei o problema, se eu estou executando o script de shell como este que eu vou estar executando no meu sistema de produção e se o servidor estiver em baixo, então ele não imprime "Olá" em tudo. Mas se eu executar o script de shell acima na Atualização 1 e se o servidor estiver inoperante, funcionará bem.
#!/bin/bash
COUNT=60 #number of 10 second timeouts in 10 minutes
HOSTNAME=machineA
DATA=""
RETRY=10
while [[ $COUNT -ge "0" ]]; do
while [ $RETRY -gt 0 ]
do
#send the request, put response in variable
DATA=$(wget -O - -q -t 1 http://$HOSTNAME:8080/beat)
echo "Hello"
if [ $? -eq 0 ]
then
break
else
let RETRY-=1
sleep 30
fi
done
if [ $RETRY -eq 0 ]
then
exit 2
fi
#grep $DATA for process and process_behind
PROCESS=$(echo $DATA | grep -oE 'process: [0-9]+' | awk '{print $2}')
PROCESS_BEHIND=$(echo $DATA | grep -oE 'process_behind: [0-9]+' | awk '{print $2}')
echo $PROCESS
echo $PROCESS_BEHIND
#verify conditionals
if [[ $PROCESS -gt "8" && $PROCESS_BEHIND -eq "0" ]]; then exit 0; fi
#decrement the counter
let COUNT-=1
#wait another 10 seconds
sleep 10
done
Isto é o que eu estou recebendo no modo de depuração com o script acima -
david@some-machine:~$ bash -x ./ping1.sh
+ set -e
+ COUNT=60
+ HOSTNAME=machineA
+ DATA=
+ RETRY=10
+ echo machineA
machineA
+ [[ 60 -ge 0 ]]
+ '[' 10 -gt 0 ']'
++ wget -O - -q -t 1 http://machineA:8080/beat
+ DATA=
Eu acho que ambos os scripts são os mesmos? Então por que isso está acontecendo?