8
until [ $(aws ssm get-automation-execution --automation-execution-id "$id" --query 'AutomationExecution.AutomationExecutionStatus' --output text) = *"InProgress"* ];
do
  echo "Automation is running......"
  sleep 1m
done
status=$(aws ssm get-automation-execution --automation-execution-id "$id" --query 'AutomationExecution.AutomationExecutionStatus' --output text)
if [ "$status" == "Success" ]; then
    echo "Automation $status"
elif [ "$status" == "Failed" -o "$status" == "Cancelled" -o "$status" == "Timed Out" ]; then
    echo "Automation $status"
fi

here the loop is never exiting, it keeps printing "Automation is running......" even after automation has been executed and status is not inprogress what i want to do is wait until status is " inprogress", print "Automation is running......" on screen. once its finished, i want to print the status of automation on screen if it failed or succeeded.

chandra
  • 693
  • 3
  • 8
  • 21
  • 1
    Shouldn't it be the other way around, `while` instead of `until`? You might never see that string if the command finishes fast, and you want to wait while it runs, not until it does. – Benjamin W. Aug 22 '18 at 21:05
  • i tried changing until with while but still the loop doesn't exit. i am unable to understand how to write this loop. – chandra Aug 23 '18 at 02:31

2 Answers2

9

adding an if else until helped me get out of the loop.

until [ $(aws ssm get-automation-execution --automation-execution-id "$id" --query 'AutomationExecution.AutomationExecutionStatus' --output text) = *"InProgress"* ];
do
  echo "Automation is running......"
  sleep 10s
  if [ $(aws ssm get-automation-execution --automation-execution-id "$id" --query 'AutomationExecution.AutomationExecutionStatus' --output text) != "InProgress" ]; then
     echo "Automation Finished"
     status=$(aws ssm get-automation-execution --automation-execution-id "$id" --query 'AutomationExecution.AutomationExecutionStatus' --output text)
     echo "Automation $status"
     if [$status != "Success"]; then
        exit 3
        echo "Automation $status"
     fi   
    break
  fi
done
chandra
  • 693
  • 3
  • 8
  • 21
6

This is a general function which I use:

function wait_for() {
    timeout=$1
    shift 1
    until [ $timeout -le 0 ] || ("$@" &> /dev/null); do
        echo waiting for "$@"
        sleep 1
        timeout=$(( timeout - 1 ))
    done
    if [ $timeout -le 0 ]; then
        return 1
    fi
}

You can have another function which checks the condition:

function is_still_running() {
    aws_status=$(aws ssm get-automation-execution --automation-execution-id "$id" --query 'AutomationExecution.AutomationExecutionStatus' --output text)
    if [ "${aws_status}" = *"InProgress"* ]; then
        return 0;
    else
        return 1;
    fi
}

then the usage would be:

wait_for 100 is_still_running
Alon Gouldman
  • 3,025
  • 26
  • 29
  • This is very nice, probably make a slight change so it can read like: `wait_for_job aws_run or_timeout` – dhwang Jun 27 '23 at 16:18