我使用 AWS CLI 和 bash 来创建和复制 RDS 快照。我有一个直到循环运行,条件是一旦快照的状态为“可用”,循环应该关闭并执行附加代码来复制快照。但是,我在 AWS 控制台中看到状态可用,但脚本继续挂起,因此循环没有按应有的方式退出。我在循环中做错了什么?
代码:
#/bin/bash/
now=$(date '+%Y-%m-%d-%H')
# Creates DB snapshot
echo ---------------------------------------- >> create_snap.txt
echo Start time: >> create_snap.txt
date >> create_snap.txt
aws rds create-db-snapshot --db-instance-identifier db --db-snapshot-identifier test-for-dr-$now
while true; do
STATUS=`aws rds describe-db-snapshots --db-snapshot-identifier test-for-$now | grep "Status" | awk '{print $2}' | sed 's/[",]//g'`
until [ "$STATUS" == "available" ]; do
echo "" &> /dev/null
if [ "$STATUS" == "available" ]; then
break 2
fi
done
done
echo Completion time: >> create_snap.txt
date >> create_snap.txt
echo ---------------------------------------- >> create_snap.txt
echo "" >> create_snap.txt
任何帮助,将不胜感激!
答案1
继续各种评论,您应该将脚本修改为如下所示:
#/bin/bash/
now=$(date '+%Y-%m-%d-%H')
# Creates DB snapshot
echo ---------------------------------------- >> create_snap.txt
echo Start time: >> create_snap.txt
date >> create_snap.txt
aws rds create-db-snapshot --db-instance-identifier db --db-snapshot-identifier test-for-dr-$now
while true; do
STATUS=`aws rds describe-db-snapshots --db-snapshot-identifier test-for-$now | grep "Status" | awk '{print $2}' | sed 's/[",]//g'`
if [ "$STATUS" == "available" ]; then
break
else
echo "" &> /dev/null
fi
sleep 15
done
echo Completion time: >> create_snap.txt
date >> create_snap.txt
echo ---------------------------------------- >> create_snap.txt
echo "" >> create_snap.txt
正如你所看到的,有一个循环,$STATUS 变量在循环中更新,并且有一个sleep 15
避免锤击 api 的方法