Como implementar o mecanismo de repetição ao executar a URL do servidor no script de shell?

2

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?

    
por arsenal 25.04.2014 / 18:15

1 resposta

1

Você pode usar um loop simples:

....
DATA=""
RETRY=10

while [ "$RETRY" -gt 0 ]; do
  DATA="$(wget -O - -q -t 1 http://hostname.domain.com:8080/beat)"
  if [ $? -eq 0 ]
  then
    break
  else
    let RETRY-=1
    sleep 30
  fi
done

if [ "$RETRY" -eq 0 ]
then
  exit 2
fi
....
    
por 25.04.2014 / 18:38