Разработка сайтов, дизайн и мультимедиа
+38 044‎ 494 35 20
Главная / Лаборатория / Скрипт мониторинга системы
Скрипт мониторинга системы

Подготовительная часть

В этой части скрипты мы объявим все константы, которые будем использовать во всех остальных составляющих скрипта.

#/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

Добавить комментарий:

Ваш комментарий (осталось символов: 1000)


Мониторинг свободного места на диске

Задача: определить предел заполненности дисков, по которому сигнализировать администратору об проблемах.

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

Добавить комментарий:

Ваш комментарий (осталось символов: 1000)


Мониторинг нагрузки

Задача стоит следующая: определить границу нагрузки, после которой сигнализировать ответственным лицам. И при возможности постараться выяснить какие процессы создают нагрузку.

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

Добавить комментарий:

Ваш комментарий (осталось символов: 1000)


Миниторинг запущены ли необходимые сервисы

Цель: произвести проверку запущены или нет необходимые нам сервисы.

# Первым делом, составляем список процессов, которые мы будем мониторить
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

Добавить комментарий:

Ваш комментарий (осталось символов: 1000)


Проверка наличия бекапов

Эта часть скрипта проста: необходимо просто проверить наличие директории со вчерашней датой создания в папке бекапов.

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

Добавить комментарий:

Ваш комментарий (осталось символов: 1000)


Финальная часть - отправка почты и инсталляция скрипта

Задача финальной части скрипта - определение 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

Добавить комментарий:

Ваш комментарий (осталось символов: 1000)

×
  • Facebook
  • Google
  • Twitter