Simultaneamente executar curl e um temporizador de processo

0

Estou tentando executar simultaneamente um comando curl e, essencialmente, executar um cronômetro em quanto tempo ele leva para ser concluído. Temos tido alguns problemas com o tempo de resposta dos URLs e gostaria de criar um temporizador que reexecute os cachos até mais 2 vezes se ultrapassar os 90 segundos. Após a 3ª vez, apenas ecoaria uma mensagem de erro e sairia.

Eu tentei muitas variações de algo semelhante ao código abaixo em instruções if e while, mas recebo um loop infinito que não consigo sair do console, ou tive apenas que pular para o último caso declaração que diz if [ $timer -eq 90] ; then ..., ou simplesmente não faz parte do if / elif de todo.

Este é o meu código atual:

retry=0
curl -K $conf/appdCurlConfig $prodc $base1d $base3d $base1w $base2w -o $prodCurl -o $base1dCurl -o $base3dCurl -o $base1wCurl -o $base2wCurl && cpid='ps -o etime= -p $!'
SECONDS=0
timer=$(( cpid+$SECONDS ))

if [ $retry -lt 3 ] ; then
  if [ $timer -eq 45 ] ; then
    echo -e "\e[93mYour request is taking longer than expected, but is still processing\e[m"
  fi
  if [ $timer -eq 55 ] ; then
    echo -e "\e[93mYour request is still processing\e[m"
  fi
  if [ $timer -eq 65 ] ; then
    echo -e "\e[93mYour request is still processing\e[m"
  fi
  if [ $timer -eq 75 ] ; then
    echo -e "\e[93mYour request is still processing\e[m"
  fi
  if [ $timer -eq 85 ] ; then
    echo -e "\e[93mYour request is still processing\e[m"
  fi
  if [ $timer -ge 90 ] ; then
    echo -e "\e[31mWe are experiencing some technical difficulty, or it has taken over 90 seconds to reach $appset; restarting your request\e[m"
    run $param1 $param2 $param3
    let retry++
  else
    if [ $retry -eq 3 ] ; then
      echo -e "\e[93mWe are unable to reach $appset at this time, please try again in 5 minutes"
      echo -e "If you keep getting this error message, please contact the system administrator\e[m"
      exit 2
    fi
  fi
fi

Também tentei executá-lo em segundo plano com um único & , tentei criar abaixo sua própria função e chamá-lo com & e && , e testei o seguinte em $(below code) , por isso seria & $(code) ou && $(code) .

ctimer() {
cpid=$(ps -o etime= -p $!)
SECONDS=0
timer=$(( cpid+$SECONDS ))
if [ $retry -lt 3 ] ; then
  if [ $timer -eq 45 ] ; then
    echo -e "\e[93mYour request is taking longer than expected, but is still processing\e[m"
  fi
  if [ $timer -eq 55 ] ; then
  echo -e "\e[93mYour request is still processing\e[m"
  fi
  if [ $timer -eq 65 ] ; then
  echo -e "\e[93mYour request is still processing\e[m"
  fi
  if [ $timer -eq 75 ] ; then
  echo -e "\e[93mYour request is still processing\e[m"
  fi
  if [ $timer -eq 85 ] ; then
  echo -e "\e[93mYour request is still processing\e[m"
  fi
  if [ $timer -ge 90 ] ; then
    echo -e "\e[31mWe are experiencing some technical difficulty, or it has taken over 90 seconds to reach $appset; restarting your request\e[m"
    run $param1 $param2 $param3
    let retry++
  else
    if [ $retry -eq 3 ] ; then
      echo -e "\e[93mWe are unable to reach $appset at this time, please try again in 5 minutes"
      echo -e "If you keep getting this error message, please contact the system administrator\e[m"
      exit 2
    fi
  fi
fi
}

Para esclarecer algumas das variáveis, $conf/ é uma variável de caminho, $prodc e todas as $base * são variáveis de URL, a outra deve ser autoexplicativa e $appset é o aplicativo interno para curl. run é uma função desse script e $param * são a entrada inicial do usuário.

O que estou perdendo ou simplesmente não é possível? Devo também incluir uma chamada kill antes de tentar executar os cachos novamente? Obrigado pela sua ajuda.

    
por brehma 05.06.2018 / 20:13

2 respostas

1

Você está superestimando as coisas e pode não estar ciente de alguma funcionalidade interna que bash (que você não está especificando, presumo que seu shell seja) fornece:

retries=0
timeout=90
duration=0
complete=0
maxretries=3
while [[ 0 -eq "$complete" ]]; do
    curl -K $conf/appdCurlConfig $prodc $base1d $base3d $base1w $base2w -o $prodCurl -o $base1dCurl -o $base3dCurl -o $base1wCurl -o $base2wCurl &
    curlpid=$! # capture PID of curl command
    while [[ "$timeout" -gt "$duration" ]] && kill -0 $curlpid 2> /dev/null; do
        sleep 1
        duration=$((duration+1))
        case $duration in
            3) 
                echo "It's taking a bit longer.."
                ;;
            30|45|75)
                echo "It's taking a real long time but we'll keep waiting"
                ;;
            85)
                echo "We're about to give up"
                ;;
            $timeout)
                echo "We're giving up."
                kill -TERM $curlpid
                retries=$((retries+1))
                if [[ "$retries" -ge "$maxretries" ]]; then
                    complete=1
                fi
                ;;
        esac
    done
    if wait $curlpid; then
        complete=1 # curl returned non-error; we're done!
    fi
done

kill -0 enviará um sinal nulo; Ele pode ser usado para ver se um processo realmente existe sem realmente afetá-lo. O shell irá capturar o PID de uma tarefa em segundo plano em $! . E sua if..elif ladder é um exemplo de livro didático de algo a ser recolhido em uma instrução case..esac .

    
por 05.06.2018 / 20:33
0

Se você pode aceitar as informações de progresso não é tão bonito:

parallel --retries 3 --timeout 10 curl ::: url &&
  echo success ||
  echo failed

Exemplo:

$ parallel --retries 3 --timeout 10 curl ::: 10.1.1.1 &&
    echo success ||
    echo failed
parallel: Warning: This job was killed because it timed out:
parallel: Warning: curl 10.1.1.1
parallel: Warning: This job was killed because it timed out:
parallel: Warning: curl 10.1.1.1
parallel: Warning: This job was killed because it timed out:
parallel: Warning: curl 10.1.1.1
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:10 --:--:--     0failed
    
por 07.07.2018 / 20:08