我有一個看起來像這樣的腳本,該腳本通過在每個回圈上重新定義 x 來檢查我的 pod 是否處于運行狀態。
x=$(/opt/oc get pods --selector app=${bamboo.shortPlanName} -o jsonpath='{range .items[]}{.status.phase}{"\n"}{end}')
until [ "$x" == "Running" ];
do
sleep 5
x=$(/opt/oc get pods --selector app=${bamboo.shortPlanName} -o jsonpath='{range .items[]}{.status.phase}{"\n"}{end}')
echo $x
done
但是,我想修改我當前的腳本也支持超時,我的意思是在回圈 60 秒后應該停止,或者在回圈 12 次后應該停止。知道怎么做嗎?
uj5u.com熱心網友回復:
bash提供了一個特殊的變數SECONDS,可以用作粗略計時器。
SECONDS=0
while (( SECONDS < 60)); do
x=$(/opt/oc get pods --selector app=${bamboo.shortPlanName} -o jsonpath='{range .items[]}{.status.phase}{"\n"}{end}')
if [[ $x == Running ]]; then
break
fi
sleep 5
done
的擴展不是為您提供分配的值,而是分配后SECONDS的秒數與分配的值之間的差異。效果就像一個變數,其值每秒增加 1。
uj5u.com熱心網友回復:
對于 60 秒后的超時,請嘗試以下Shellcheck -clean 代碼:
#! /bin/bash -p
readonly kOC_SLEEP_SECS=5
readonly kOC_TIMEOUT_SECS=60
initial_secs=$SECONDS
while
status=$(/opt/oc get pods --selector app=bamboo.shortPlanName \
-o jsonpath='{range .items[]}{.status.phase}{"\n"}{end}')
printf '%s\n' "$status"
[[ $status != Running ]]
do
if (( (SECONDS - initial_secs) >= kOC_TIMEOUT_SECS )); then
echo 'ERROR: Timed out' >&2
exit 1
fi
sleep -- "$kOC_SLEEP_SECS"
done
- 我替換
app=${bamboo.shortPlanName}為app=bamboo.shortPlanName因為舊代碼導致 Bash 錯誤。您需要正確修復它。 - 請參閱為什么 printf 比 echo 更好?解釋為什么我替換
echo為printf列印狀態。 - 該代碼將超時視為錯誤,并以錯誤狀態退出。你可能想做一些不同的事情。
- 實際的超時時間將在 60 到 65 秒之間(或者更多一點)。如果您需要更準確的超時,則需要做一些不同的事情。
對于 12 次迭代后的超時,請在上面的代碼中嘗試這個Shellcheck -clean 變體:
#! /bin/bash -p
readonly kOC_SLEEP_SECS=5
readonly kOC_MAX_ITERS=12
oc_iters=0
while
status=$(/opt/oc get pods --selector app=bamboo.shortPlanName \
-o jsonpath='{range .items[]}{.status.phase}{"\n"}{end}')
printf '%s\n' "$status"
[[ $status != Running ]]
do
if (( oc_iters >= kOC_MAX_ITERS )); then
echo 'ERROR: Timed out' >&2
exit 1
fi
sleep -- "$kOC_SLEEP_SECS"
done
uj5u.com熱心網友回復:
我認為這trap是獲得準確超時的最簡單方法。
原型:
#! /bin/bash
HALT=0
TIMEOUT=4
# Trap for SIGALRM
stop_loop() {
HALT=1
}
# Set trap
trap stop_loop SIGALRM
# The timeout goes after $TIMEOUT seconds.
{ sleep $TIMEOUT && kill -SIGALRM $$ & }
# Main loop
until false || [[ $HALT -eq 1 ]]; do
sleep 1
echo 'loop'
done
echo 'out of loop'
exit 0
在您的情況下,這看起來像:
HALT=0
TIMEOUT=4
stop_loop() {
HALT=1
}
trap stop_loop SIGALRM
x=$(/opt/oc get pods --selector app=${bamboo.shortPlanName} \
-o jsonpath='{range .items[]}{.status.phase}{"\n"}{end}')
{ sleep $TIMEOUT && kill -SIGALRM $$ & }
until [ "$x" == "Running" ] || [[ $HALT -eq 1 ]];
do
sleep 5
x=$(/opt/oc get pods --selector app=${bamboo.shortPlanName} \
-o jsonpath='{range .items[]}{.status.phase}{"\n"}{end}')
echo $x
done
exit 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/440886.html
上一篇:使用bash檔案替換字串
下一篇:如何將帶引數的函式作為引數傳遞?
