[英]Bash Retry - Azure CLI
我在美国西部有一个 Azure 存储帐户,启用了异地复制以与美国东部同步,我想根据需要使用 bash 脚本执行故障转移。
我已经定义了以下 function
_STORAGE_ACCOUNT_FAILOVER () {
echo "Storage account failover is initiated.."
az storage account failover --name $STORAGEACCOUNT --no-wait --yes
echo "Storage account failover is completed successfully.."
}
在尝试执行上述 function 时,出现以下错误
ERROR: (ResourceCollectionRequestsThrottled) Operation 'Microsoft.Storage/storageAccounts/read' failed as server encountered too many requests.
Please try after '17' seconds. Tracking Id is ''.
如果出现任何问题,我想实现重试逻辑吗? 如何实现重试逻辑?
就像是
_STORAGE_ACCOUNT_FAILOVER () {
echo "Storage account failover is initiated.."
performFailover:
az storage account failover --name $STORAGEACCOUNT --no-wait --yes
if [ "$?" -ne 0 ]; then
goto performFailover;
fi
echo "Storage account failover is completed successfully.."
}
或类似的东西
_STORAGE_ACCOUNT_FAILOVER () {
echo "Storage account failover is initiated.."
while true; do
az storage account failover --name $STORAGEACCOUNT --no-wait --yes
if [ "$?" -eq 0 ]; then
break;
fi
sleep 30s
done
echo "Storage account failover is completed successfully.."
}
人类可读的错误信息有些问题; 你能以机器可读的形式获得请求的重试等待吗?
这是一个速写,假设az
在超时时设置了一个非零退出代码。 (如果你幸运的话,它会有一个针对这个特定错误的唯一退出代码。)
_STORAGE_ACCOUNT_FAILOVER () {
echo "$0: Storage account failover initiated" >&2
while true; do
if result=$(az storage account failover \
--name "$STORAGEACCOUNT" \
--no-wait --yes 2>&1 >/dev/null)
then
break
else
rc=$?
case $result in
*"Please try after '"*)
seconds=${result#*Please try after \'}
seconds=${seconds%%\'*}
wait "$seconds"
;;
*) echo "$0: $result" >&2
exit $rc
;;
esac
fi
done
echo "$0: Storage account failover completed successfully" >&2
}
注意我们如何从az
命令捕获标准错误并解析出超时消息,或者如果我们不能返回错误。 还要注意如何将所有诊断消息打印为标准错误,并以电报格式进行格式化,但始终在消息中使用脚本的名称,因此如果您有脚本调用脚本调用脚本等,您可以判断哪个脚本失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.