>我有一个名为"qe/performance"的路径位置,想要将"jmx"文件复制到 AWS 中的 S3 存储桶。复制文件后,我想使用 while 循环将结果文件夹中转换后的文件 (.jtl( 列出到 s3 存储桶中。如果文件存在(成功(,它将更新 ECS 集群并删除 ec2 实例以减少负载并将消息发送到该文件已上传的组。
另一方面,如果转换后的文件未呈现到 S3 存储桶中的结果文件夹,我想将"超时阈值"设置为 10 分钟,并使用迭代和睡眠 60 秒等待文件上传到 S3 存储桶。如果迭代周期超过超时阈值,它将发送电子邮件通知文件尚未上传。
#/bin/bash
TimeoutThreshold=10
holder="qe/performance/"
echo $holder
for files in $holder; do
aws s3 cp $files s3://$JMeterFilesBucket/scripts/ --recursive
i=0
while [ true ]; do
aws s3 ls s3://$JMeterFilesBucket/results/ --recursive |grep .jtl
if [ "$?" -ne "0" ]; then
sleep 60
iterator=$i + 1
if [ iterator -eq "$TimeoutThreshold" ]; then
aws sns publish --topic-arn ${Subscription} --message "files (HTML Reports/.jtl) failed to load to the s3 bucket: s3://$JMeterFilesBucket/results/";
else
sleep 60
fi
exit 0
else [ "$?" -eq "0" ]; then
aws ecs update-service --cluster $Cluster --service $Service --desired-count $CURRENT_DESIRED_COUNT --region ${AWS::Region}
echo "publishing SNS Notification for the files that have been uploaded successfully"
aws sns publish --topic-arn ${Subscription} --message "files (HTML Reports/.jtl) have successfully loaded to the s3 bucket: s3://$JMeterFilesBucket/results/";
break
fi
done
done
这是运行此命令后的结果,它仍然继续显示这样的文件列表并中断
在这两种情况下都没有电子邮件通知通过
qe/performance/
21:49:50
Completed 14.7 KiB/14.7 KiB (86.3 KiB/s) with 1 file(s) remaining upload: qe/performance/ContribAccl_Dev.jmx to s3://retqa-jmeterfiles/scripts/ContribAccl_Dev.jmx
21:49:52
2019-09-11 17:41:12 1460 results/ContribAccl_Dev.jmx.jtl
21:49:52
2019-09-06 03:16:32 1653 results/Sample13.jmx.jtl
21:49:52
2019-09-09 15:19:40 163 results/Sample15.jmx.jtl
21:49:52
2019-09-11 17:41:12 1460 results/ContribAccl_Dev.jmx.jtl
21:49:52
2019-09-06 03:16:32 1653 results/Sample13.jmx.jtl
21:49:52
2019-09-09 15:19:40 163 results/Sample15.jmx.jtl
21:49:52
2019-09-11 17:41:12 1460 results/ContribAccl_Dev.jmx.jtl
21:49:52
2019-09-06 03:16:32 1653 results/Sample13.jmx.jtl
21:49:52
2019-09-09 15:19:40 163 results/Sample15.jmx.jtl
21:49:52
2019-09-11 17:41:12 1460 results/ContribAccl_Dev.jmx.jtl
21:49:52
2019-09-06 03:16:32 1653 results/Sample13.jmx.jtl
21:49:52
2019-09-09 15:19:40 163 results/Sample15.jmx.jtl
21:49:54
2019-09-11 17:41:12 1460 results/ContribAccl_Dev.jmx.jtl
21:49:54
2019-09-06 03:16:32 1653 results/Sample13.jmx.jtl
21:49:54
2019-09-09 15:19:40 163 results/Sample15.jmx.jtl
21:49:54
2019-09-11 17:41:12 1460 results/ContribAccl_Dev.jmx.jtl
21:49:54
2019-09-06 03:16:32 1653 results/Sample13.jmx.jtl
21:49:54
2019-09-09 15:19:40 163 results/Sample15.jmx.jtl
你这里有一个错字:
#/bin/bash
这应该从#!
开始,而不仅仅是#
。
这是错误的:
else [ "$?" -eq "0" ];
你不要在else
之后提出条件。如果要进行其他测试,则必须使用elif
。
但是不需要其他条件。此条件与第一个条件正好相反,因此只需编写else
,它就会执行代码。
if [ "$?" -ne "0" ]; then
sleep 60
iterator=$i + 1
if [ iterator -eq "$TimeoutThreshold" ]; then
aws sns publish --topic-arn ${Subscription} --message "files (HTML Reports/.jtl) failed to load to the s3 bucket: s3://$JMeterFilesBucket/results/";
else
sleep 60
fi
exit 0
else
aws ecs update-service --cluster $Cluster --service $Service --desired-count $CURRENT_DESIRED_COUNT --region ${AWS::Region}
echo "publishing SNS Notification for the files that have been uploaded successfully"
aws sns publish --topic-arn ${Subscription} --message "files (HTML Reports/.jtl) have successfully loaded to the s3 bucket: s3://$JMeterFilesBucket/results/";
break
fi
then
后也无需转义换行符。
while
循环似乎也没有任何意义。如果条件为 true,它将使用exit
终止脚本,但如果条件为 false,它将使用break
停止循环。无论哪种方式,都只运行循环的第一次迭代。
这不是递增变量的正确方法:
iterator=$i + 1
这将尝试在环境变量iterator
设置为$i
的情况下执行语句+ 1
。但+ 1
不是有效的命令。你应该写:
((iterator = $i + 1))
双括号使其成为算术表达式,而不是普通命令。
然后,您需要在测试iterator
变量时将其放在$
之前:
if [ "$iterator" -eq "$TimeoutThreshold" ]; then
但是,$i
总是0
,因为您永远不会增加它。如果循环没有立即结束,您可以使用
((i++))
在循环的末尾。
我只想解决你的 if/else 语句的一般结构。 如果你的语法正确,你会写:
if [ "$?" -ne "0" ]; then
command_1
elif [ "$?" -eq "0" ]; then
command_2 # This can never happen
else
command_3
fi
但这是错误的。 第二个命令列表(elif的部分(永远不会发生。 原因是,如果前面的命令失败,则将执行command_1
,并且不会执行command_2或command_3。 但是,如果前面的命令没有失败,则[ "$?" -ne "0" ]
将失败,将$?
设置为非零值。 然后[ "$?" -eq "0" ]
将失败,因为if
部分执行的命令更改了$?
的值。 不要这样写。