В этой части скрипты мы объявим все константы, которые будем использовать во всех остальных составляющих скрипта.
#/bin/bash
# массив e-mail-адресов, на который отправлять сообщение о проблемах
report_to=([email protected] [email protected])
sendmail="/usr/sbin/sendmail"
backup_hours=32
host=`/bin/hostname`
nginx_status_host="web2.newagelab.com"
# отправляем уведомления с адреса monitor@hostname сервера
report_from=monitor@$host
#изначально считаем что в системе все нормально и письмо
errors=0
df_report=90
top_report=5
mailfile="/tmp/services-check-`date +%F`.mail"
pidfile="/tmp/services-check-`date +%F`.pid"
#зачищаем старые файлы (более 30 минут) и предотвращаем повторный запуск скрипта
find /tmp/services-check-* -type f -mmin +30 -exec rm {} \;
if [ -f $pidfile]; then exit; fi
echo `date`>$pidfile
echo "Это письмо создано автоматически сервисом мониторинга нагрузки от компании newagelab.com\n">$mailfile
Задача: определить предел заполненности дисков, по которому сигнализировать администратору об проблемах.
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $1 }' | while read output;
do
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 )
partition=$(echo $output | awk '{ print $2 }' )
if [ $usep -ge $df_report ]; then
errors=$((errors+1))
echo "\nПартишн $partition занят на $usep% на $(date)">>$mailfile
fi
done
Задача стоит следующая: определить границу нагрузки, после которой сигнализировать ответственным лицам. И при возможности постараться выяснить какие процессы создают нагрузку.
mytop=`uptime | grep -o 'load average.*' | cut -c 15-18`
if [ $mytop -ge $top_report ]; then
echo "==== ВНИМАНИЕ ====\nНагрузка на сервер выше нормы: $mytop">>$mailfile
topprocs=`ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10`
echo "\nНагружают процессор: $topprocs\n===================\n">>$mailfile
// проверка списка выполняемых запросов апачем
echo "\nApache\n===================\n">>$mailfile
lynx -dump http://127.0.0.1/server-status>>$mailfile
// проверка списка выполняемых запросов php-fpm
echo "\nPHP-FPM\n===================\n">>$mailfile
top -i -n 1 -b | grep -w php-fpm>>$mailfile
// проверка списка выполняемых запросов nginx
echo "\nNginx info\n===================\n">>$mailfile
lynx -dump http://$nginx_status_host/nginx_status>>$mailfile
// проверка списка выполняемых запросов mysql
// проверка количества сообщений в mailq
fi
Цель: произвести проверку запущены или нет необходимые нам сервисы.
# Первым делом, составляем список процессов, которые мы будем мониторить
daemons=( crond memcached nginx php-fpm sshd proftpd posix )
scripts=(
"/etc/init.d/crond start"
"/etc/init.d/memcached start"
"/etc/init.d/nginx start"
"/etc/init.d/php-fpm start"
"/etc/init.d/sshd start"
"/etc/init.d/proftpd start"
"/etc/init.d/posix start"
)
# получаем длину массива
dlen=${#daemons[@]}
# организовываем цикл по массиву daemons
for (( i=0; i<${dlen}; i++ ));
do
// в переменную checkrez загоняем результат проверки наличия сервиса
checkrez=`ps -A|grep ${daemons[$i]}|wc -l`
// если $checkrez значение равно нулю - значит процесс отсутсвует
// отсылаем уведомление попытаемся запустить соответсвующей командой из массива $scripts
if [ $checkrez -eq 0 ]; then
echo "${daemons[$i]} не обнаружен в запущенных процессах\n">>$mailfile
if [ ${scripts[$i]} -ne "" ]; then
`${scripts[$i]}`
checkrez=`ps -A|grep ${daemons[$i]}|wc -l`
if [ $checkrez -eq 0 ]; then
echo "ВНИМАНИЕ!!! ${daemons[$i]} не смогли перезапустить! Требуется ручное вмешательство\n===================\n">>$mailfile
else
echo "$mailbody\nНо ${daemons[$i]} успешно запустили заново.n===================\n">>$mailfile
fi
fi
fi
done
Эта часть скрипта проста: необходимо просто проверить наличие директории со вчерашней датой создания в папке бекапов.
if [ -d $backups_dir/daily.0 ]; then
((backup_age=(`date +%s` - `date -r /var/backups/daily.0 +%s`)/60/60))
if [ $backup_age -gt $backup_hours ]; then
echo "Возраст бекапа: $backup_age часов!\n">>$mailfile
fi
else
echo "Отсутствуют бекапы! Бекапы неправитльно настроены или не отработали\n">>$mailfile
fi
Задача финальной части скрипта - определение MTA и отправка почты.
Кроме того - прописываем в крон сам скрипт мониторинга.
// Единственная сложность - ограничить отправку 3-мя сообщениями. Для этого используем файл-счетчик в /tmp
b_pid="/tmp/services-check-backup-`date +%F`.pid"
if [-f $b_pid]; then
attemp=`/bin/cat $b_pid`
else
attemp=0
fi
if [$attemp -lt 3]; then
attemp=$((attemp+1))
echo $attemp>$b_pid
$sendmail -t $mailfile;
fi
rm -rf $pidfile
rm -rf $mailfile
Добавить комментарий: