#!/bin/bash
# Copyright 2006-2017, Matthew Welland.
#
# This file is part of Megatest.
#
# Megatest is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Megatest is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Megatest. If not, see <http://www.gnu.org/licenses/>.
LOADRUNNER=$0
# load=`uptime|awk '{print $10}'|cut -d, -f1`
load=$(uptime|perl -pe 's/.*: (\d+.\d+),.*/$1/')
load2=$(uptime|perl -pe 's/.*: (\d+.\d+), (\d+.\d+),.*/$2/')
# echo "load2=$load2, load=$load"
# Run a job detached from stdin/stdout (i.e. daemonized)
# Launch on remotehost if specified by TARGETHOST
#
function launchjob () {
# Can't always trust $PWD
CURRWD=`pwd`
if [[ $TARGETHOST_LOGF == "" ]]; then
TARGETHOST_LOGF=NBFAKE-`date +%GWW%V.%u_%T`
fi
# echo "#======================================================================"
# echo "# NBFAKE Running command:"
# echo "# \"$*\""
# echo "#======================================================================"
if [[ $TARGETHOST == "" ]]; then
sh -c "cd $CURRWD;export DISPLAY=$DISPLAY; export PATH=$PATH; nohup $* > $TARGETHOST_LOGF 2>&1 &"
else
ssh -n -f $TARGETHOST "sh -c \"cd $CURRWD;export DISPLAY=$DISPLAY; export PATH=$PATH; nohup $* > $TARGETHOST_LOGF 2>&1 &\""
fi
}
function get_delay_time () {
RANGE=$1
number=$RANDOM
let "number %= $RANGE"
echo $number
}
if which cpucheck > /dev/null;then
numcpu=`cpucheck|tail -1|awk '{print $6}'`
elif which lscpu > /dev/null;then
numcpu=`lscpu|grep "CPU.s.:"|awk '{print $2}'`
else
numcpu=2
fi
# NB// max_load is in units of percent.
#
lperc=$(echo "100 * $load / $numcpu"|bc)
lperc2=$(echo "100 * $load2 / $numcpu"|bc)
let "lperc2adj=$lperc2 + $numcpu"
if [[ "x$MAX_ALLOWED_LOAD" == "x" ]]; then
max_load=100
else
max_load=$MAX_ALLOWED_LOAD
fi
lfile=/tmp/loadrunner-$USER.lockfile
lockfile -r 5 -l 60 $lfile &> /dev/null
if [[ $lperc -lt $max_load ]];then
if [[ $lperc -le $lperc2adj ]];then
# echo "Load acceptable: lperc=$lperc %, max_load=$max_load %, load=$load, numcpu=$numcpu, MAX_ALLOWED_LOAD=$MAX_ALLOWED_LOAD % and $lperc2 < $lperc"
# echo "Starting command: \"$@\""
launchjob "$@"
# we sleep ten seconds here to keep the lock a little longer and give time for
# the uptime to show a response
# sleep 2
else
echo "$LOADRUNNER $@" | at now + 2 minutes &> /dev/null
# sleep 5
fi
else
# echo "Load too high: lperc=$lperc, max_load=$max_load, waiting two minutes before trying to run command: \"$@\""
echo "$LOADRUNNER $@" | at now + 2 minutes &> /dev/null
fi
sleep $(get_delay_time 3)
rm -f $lfile