カールコマンドを同時に実行し、デフォルトでタイマーを実行して完了するのにかかる時間を計算しようとしています。 URLの応答時間にいくつかの問題があり、90秒を超える場合は、カールを最大2回再実行するタイマーを作成したいと思います。 3番目以降は、エラーメッセージのみを表示して終了します。
ifステートメントとwhileステートメントで、以下のコードに似たさまざまなバリエーションを試しましたが、コンソールで中断できない無限ループが発生したり、最後のifステートメントにジャンプしたりします。if [ $timer -eq 90] ; then
... 、または if/elif のどの部分もまったく実行しません。
これは私の現在のコードです。
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
また、シングルを使ってバックグラウンドで実行してみました&
。&
&&
$(below code)
& $(code)
&& $(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
}
一部の変数を明確にするために、1つは$conf/
パス変数、$prodc
すべて$base
*はURL変数、もう1つは説明が必要で、$appset
カールの内部アプリケーションです。run
はこのスクリプトの関数で、$param
*はユーザーの初期入力です。
私が何かを見逃しているのか、それとも不可能なのでしょうか?kill
カールをやり直す前にもう一度電話をかける必要がありますか?ご協力ありがとうございます。
ベストアンサー1
あなたはこれを過度に考えており、いくつかの組み込み機能が何であるかを知らないかもしれませんbash
(指定されていないので、シェルがあるとします)。
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
空の信号が送信されると、プロセスに実際に影響を与えずに実際に存在することを確認するために使用できます。シェルはバックグラウンドジョブのPIDをキャプチャします$!
。if..elif
はしごは、ステートメントに縮小する方法の教科書の例ですcase..esac
。