#!/bin/bash
#
# Just put it to your crontab:
#
# * * * * * root /root/bin/lalala.sh --la1 50 --la5 20 --laf 10 --service httpd --kill --process httpd
#
# It will kill all httpd processes and restart httpd service when LA1 becomes greater or equal to 50, LA5 - to 20 and LA15 - to 10
#
PATH=/bin:/sbin:/usr/bin
OPTS=$(getopt -n $(basename ${0}) -o 1:5:f:s:kp: -l la1:,la5:,laf:,service:,kill,process: -- "${@}")
if [ "${?}" -ne 0 ]; then
echo "Can't get options" >&2
exit 1
fi
eval set -- "${OPTS}"
while :; do
case "${1}" in
-1|--la1)
THR1="${2}"; shift 2;;
-5|--la5)
THR5="${2}"; shift 2;;
-f|--laf)
THR15="${2}"; shift 2;;
-s|--service)
SERVICE="${2}"; shift 2;;
-k|--kill)
KILL="1"; shift 1;;
-p|--process)
PROCESS="${2}"; shift 2;;
--)
shift; break;;
*)
echo "Can't recognize the option: ${1}"; exit 1;;
esac
done
if [ -z "${SERVICE}" ]; then
echo "Can't understand what service shall I restart" >&2
exit 1
fi
if [ "${KILL}" ] && [ -z "${PROCESS}" ]; then
echo "Can't understand what process shall I kill" >&2
exit 1
fi
LA=$( uptime | sed -r 's/^.*load average: ([0-9]+)(\.[0-9]+)?, ([0-9]+)(\.[0-9]+)?, ([0-9]+)(\.[0-9]+)?$/\1\t\3\t\5/g' )
LA1=$( echo "${LA}" | cut -f1)
LA5=$( echo "${LA}" | cut -f2)
LA15=$(echo "${LA}" | cut -f3)
if
[ -n "${THR1}" ] && [ -n "${LA1}" ] && [ "${LA1}" -ge "${THR1}" ] &&
[ -n "${THR5}" ] && [ -n "${LA5}" ] && [ "${LA5}" -ge "${THR5}" ] &&
[ -n "${THR15}" ] && [ -n "${LA15}" ] && [ "${LA15}" -ge "${THR15}" ];
then
if [ "${KILL}" ]; then
while PIDS=$(pidof ${PROCESS}); do
echo "Slaying ${PIDS}..."
kill -9 ${PIDS}
sleep 1
done
sleep 10
else
service "${SERVICE}" restart
fi
fi