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.