bash - Bash 重试 - Azure CLI
问题描述
我在美国西部有一个 Azure 存储帐户,启用了地理复制以与美国东部同步,我想根据需要使用 bash 脚本执行故障转移。
我已经定义了以下功能
_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.."
}
在尝试执行上述功能时,出现以下错误
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
命令中捕获标准错误并解析出超时消息,或者如果我们不能返回错误。还要注意如何将所有诊断消息打印为标准错误,并以电报格式进行格式化,但始终在消息中使用脚本的名称,因此如果您有脚本调用脚本调用脚本等,您可以判断哪个脚本失败。
推荐阅读
- html - 使用 flex 和 css 网格制作响应式布局
- python - OpenCV 无法连接到 X 服务器
- arrays - 如何在 mongo db 聚合中将数据作为数组获取
- excel - 检查多列,如果发现它从一个单元格返回数据
- php - PHP 启动:无法加载动态库 'pdo_mysql'
- android - 在 Flutter 中打开屏幕时如何使应用程序屏幕出现
- java - 在 java 中使用 thymleaf html 模板下载 pdf 文件时,css 样式不可见
- database - Flutter:自动更新数据
- javascript - Typescript 在 json 中使用枚举
- android - 如何将图像的宽度设置为 imageView android