Self answers:如何使用单个cli命令停止集群上的所有任务,轻松地允许传递额外的参数。
我试图让Baron的答案工作,发现它需要通过从ARN中提取任务id来调整在我的AWS CodeBuild (Ubuntu)用例中工作:
aws ecs list-tasks --cluster "${clustername}" | jq -r ".taskArns[] | split("/")[2]" | xargs -n1 aws ecs stop-task --no-cli-pager --cluster "${clustername}" --task
您可能还希望仅为一个服务停止所有任务
aws ecs list-tasks --cluster "${clustername}" --service "${servicename}" | jq -r ".taskArns[] | split("/")[2]" | xargs -n1 aws ecs stop-task --no-cli-pager --cluster "${clustername}" --task
下面将:
- 获取集群中的所有任务
- 使用
jq
选择任务臂,-r
从json值。 - 通过
xargs
将每个武器传递给下一个命令,值为附加到命令后(在——task之后)。n-1
只是确保有每个武器一个命令,不确定是否有必要。
aws ecs list-tasks --cluster "$ecs_cluster" | jq -r ".taskArns[]" | xargs -n1 aws ecs stop-task --no-cli-pager --cluster "$ecs_cluster" --task
--no-cli-pager
防止stop-task
的输出在每次执行后卡住。
欢迎任何优化。我看到了awk的另一个解决方案,但发现很难将额外的参数传递给第二个命令。
如果您想使用Windows Powershell
:
$arns = aws ecs list-tasks --cluster YOUR_CLUSTER_NAME --service YOUR_SERVICE_NAME --query "taskArns" | ConvertFrom-Json
foreach ($arn in $arns) { aws ecs stop-task --no-cli-pager --cluster YOUR_CLUSTER_NAME --task $arn}