현재 AWS SSM 명령을 통해 다수의 Windows 인스턴스를 패치하고 다시 시작하고 있지만 SSM 에이전트가 항상 체크인하지 않는 문제가 있습니다. 내 생각은 작업 속도를 높이는 것입니다. 각 패치에서 while 루프 그룹을 실행하여 그룹의 각 인스턴스에 대한 가동 시간을 끌어올 수 있습니다. 모든 인스턴스가 2분 동안 작동되면 다음 그룹이 다시 시작됩니다. 이 작업을 수행하기 위해 while 루프를 올바르게 만드는 방법에 대한 간단한 질문을 이해할 수 없는 것 같습니다.
다음 명령을 bash 스크립트로 실행할 때 루프에서 "잘못된 산술 연산자"를 사용하려고 한다는 오류가 표시됩니다. 저는 $upTime 값인 "18"을 출력하여 이를 테스트했습니다.
이것은 내가 너무 많은 시간을 낭비하고 누군가가 내가 뭘 잘못하고 있는지 재빠르게 지적한 작은 혼란 중 하나인 것 같습니다. $upTime의 출력이 숫자인 경우 루프에서 더 적은 값이 작동할 것이라고 가정합니다. 18로 하드 설정하면 올바르게 반복되므로 SSM 명령에 이상한 형식 문제가 있는 것 같지만 일반 텍스트여야 하며 테스트 결과 공백이 통과되지 않습니다.
#!/bin/bash
aws ec2 reboot-instances --instance-ids `aws ec2 describe-instances --filters "Name=tag:RebootGroup,Values=01" --query 'Reservations[].Instances[].InstanceId' --output text`
sleep 30
upTime=1
while [[ $upTime -le 120 ]]
do
ssmID=$(aws ssm send-command --document-name "AWS-RunPowerShellScript" --document-version "1" --targets '[{"Key":"tag:RebootGroup","Values":["01"]}]' --parameters '{"commands":["$wmi = Get-WmiObject -Class Win32_OperatingSystem ","$uptimeSeconds = ($wmi.ConvertToDateTime($wmi.LocalDateTime)-$wmi.ConvertToDateTime($wmi.LastBootUpTime) | select-object -expandproperty \"TotalSeconds\")","[int]$uptimeSeconds"],"workingDirectory":[""],"executionTimeout":["3600"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region us-west-2 --output text --query "Command.CommandId")
echo "Value of ssmID = $ssmID"
echo "Value of upTime before sleep = $upTime"
sleep 15
upTime=$(aws ssm list-command-invocations --command-id "$ssmID" --details --query "CommandInvocations[].CommandPlugins[].{Output:Output}" --output text)
echo "Value of upTime after command invocation = $upTime"
echo "Waiting for instance uptime of 2 minutes before continuing"
done
답변1
거기에 잘못된 캐리지 리턴이 있을 것입니다.
$ upTime=$'42\r'
$ [[ $upTime -le 120 ]] && echo y || echo n
")syntax error: invalid arithmetic operator (error token is "
n
그리고 오류로 인해 [[
0이 아닌 값이 반환되고 while 루프가 너무 빨리 종료됩니다.
이 시도:
printf "Value of upTime after command invocation = %q\n" "$upTime"
내 말이 맞다면 매개변수 확장을 통해 CR을 삭제할 수 있습니다.
upTime=${upTime%$'\r'}
또는 sed를 사용하십시오
upTime=$(aws ... | sed 's/\r$//')