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.

2

2 Answers

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 

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 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy