400-busy-chk-vm
#!/bin/bash
# 
# To determine if Guest is busy or idle
#
if [ $# -ne 1 ]; then
  echo "Usage for $0 : VM Name required as argument."
  exit 1
fi
#
if [ $UID -eq 0 ]
  then echo "This script should NOT be run as root."
  exit 1
fi
#
# Source config file
if [ ! -f ~/.vbconfig ]; then
    echo "Config File ~/.vbconfig not found!"
    echo "Run: set-folders to create .vbconfig"
    exit 1
fi
. ~/.vbconfig
#
# Virtual Machine Name
VB_VM_NAME="$1"
#
# Metric period in seconds
METRIC_PERIOD=1
# Metric sample size
METRIC_SAMPLE=10
# The minimum idle percentage (decimal assumed) to allow a snapshot to be taken
LOAD_THRESHOLD=9500
# Sleep between checks for CPU idle
SLEEP_INTERVAL=60
# Retry counter
SLEEP_COUNTER=120
# Total retry hours = (SLEEP_INTERVAL x SLEEP_COUNTER)/3600
#
#SLEEP_INTERVAL=5
#SLEEP_COUNTER=12
# Establis metric
VBoxManage metrics setup \
  --period $METRIC_PERIOD --samples $METRIC_SAMPLE $VB_VM_NAME Guest/*
# Sleep for the sample period + 1 so we get a full range of metric
sleep 1
sleep $METRIC_SAMPLE
#
IDLE_AVG=0
COUNTER=0
# Loop until you run out of retry counter OR the load is below threshold
while [[ $IDLE_AVG -lt $LOAD_THRESHOLD && $COUNTER -lt $SLEEP_COUNTER ]]; do
    if (( $COUNTER > 0 )); then
        sleep $SLEEP_INTERVAL
    fi
    let COUNTER=COUNTER+1
    IDLE_AVG=`VBoxManage metrics query $VB_VM_NAME Guest/CPU/Load/Idle:avg|awk '{print $3}'|tr -cd [:digit:]`
    #echo "Iteration: $COUNTER, Idle Average: $IDLE_AVG"
done
VBoxManage metrics disable $VB_VM_NAME
 
# Validate if loop exited because of which reason
if (( $COUNTER < $SLEEP_COUNTER )); then
  # The Guest is idle
  echo "idle"
else
  # The Guest is under prolonged heavy load
  echo "busy"
fi
#
exit