Pull to refresh

Скрипт мониторинга нагрузки на Perl и Bash

Reading time2 min
Views7.8K
image

Сидя дома холодным субботним вечером, я подумал что было бы неплохо написать скрипт мониторинга нагрузки на сервере и в случае чего, делать определённые действия.

Начал я с разработки алгоритма, а как именно я могу экспортировать значение текущей нагрузки.
Все мы знакомы с замечательно командой uptime которая позволяет вынести значение в таком формате.

10:52:52 up 25 min, 4 users, load average: 0.27, 0.38, 0.43

Но тут слишком много мусора, и нам необходимо отделить текущую нагрузку, от всего остального мусора мусора.
Тут на помощь приходит всемогущий grep, с помощью не хитрых манипуляций, можно получить нагрузку уже в таком виде: load average: 0.14, 0.29, 0.38 используя следующую команду:

uptime | grep -o 'load average.*'

Конечно можно было делать поиск по ': .*' и нам бы выводило ': 0.10, 0.29, 0.38' но в данном случае это не принципиально.

Но даже в этой команде всё ещё немного мусора, тут на помощь приходит команда cut, которая позволяет обрезать нашу команду по определённым критериям. Посчитав количество знаков до интересующего нас значения, получаем что нам необходимо обрезать наш вывод с 15 до 18 знака, таким образом полная команда будет выглядеть следующим образом:

uptime | grep -o 'load average.*' | cut -c 15-18

Таким образом, мы получаем вывод в следующем виде: 0.10

С алгоритмом закончили, теперь нам необходимо сравнивать это значение с заданным в скрипте.
За основу был взят Perl т.к. я не сразу понял как можно реализовать сравнение десятичных чисел в Bash, сразу скажу что я не большой фанат Perl и это по сути первый мой работающий скрипт на Perl.

Далее идёт простейший скрипт с уже полученным алгоритмом. (На Perl)

#!/usr/bin/perl
my $load = `uptime | grep -o 'load average.*' | cut -c 15-18`; # Текущая нагрузка
my $maxload = 20; # Максимальная нагрузка

if ( $load >= $maxload ) { # Сравниваем текущую нагрузку с максимальной
`echo "$load" | mail -s 'High load [SERVERNAME]' admins\@netlevel.ru`; # Если текущая нагрузка выше максимальной, отсылать письмо
}


На Bash этот скрипт будет выглядеть следующим образом
#!/bin/bash

LOAD=`uptime | grep -o 'load average.*' | cut -c 15-18`
MAX_LOAD=20.0

if [ LOAD \> MAXLOAD ]; then
echo $LOAD | mail -s 'High load [SERVERNAME]' admins\@example.com;
fi

Спасибо хабраюзеру iSage

В данном конкретном случае, я решил просто высылать письмо на заданный ящик с помощью команды mail но вы в праве модифицировать скрипт как Вам угодно.

После того как Вы закончили модифицировать скрипт, загружаем его например в папку /bin, даём ему права на запуск chmod +x scriptname и записываем его в крон c помощью команды crontab -e
Запись для скрипта будет выглядеть приблизительно следующим образом:

2 * * * * /usr/local/bin/perl /bin/scriptname

Ну и для Bash естественно

2 * * * * /bin/bash /bin/scriptname

Я надеюсь кому нибудь этот скрипт окажется полезным.

Если у Вас есть какие либо пожелания, предложения, дополнения к скрипту, я буду рад их выслушать и добавить к топику.

Спасибо за внимание.

Спасибо за карму ребят, я ценю это, правда. Вот и делись после этого...
Tags:
Hubs:
-4
Comments25

Articles