Система мониторинга сервера
Привет! Хочу немного поделится своей идеей, в то же время попросить помощи! Это некий аналог MRTG. Но мне бы хотелось иметь возможность запускать скрипт с нужной мне частотой и в то же время чтобы посмотреть график за нужное время, а не за сутки, неделю, месяц и т.д. Например, мне может потребоваться график загрузки с 9 утра до 18.00. Или любое другое время. При этом я не хочу использовать SMNP, т.к. это дополнительное ПО, присутствие которого не всегда возможно. Например, на хостинге, где доступ ну очень сильно ограничен. Да и лишний демон по сути только загрузит и так небольшой объем памяти у тех же хостеров.
Скрипт
Итак, собираем некоторый скрипт, который будет по cron собирать статистику раз в нужное нам время. Частота не так важна, т.к. в каждый сбор будет проставляться время. Этот же скрипт будет закидывать нужные нам данные в базу данных MySQL. Ниже - сам скрипт. Кстати, часть его можно использовать и так, например, чтобы быстро посмотреть свободную память и т.д. Я использую это команды-скрипты для MRTG.
#!/bin/bash
# данные по базе
export DB_USER="smd"
export DB_PASSWD="пароль базы"
#Нам ну очень нужна дата, поэтому внизу стоит NOW()
#Считаем кол-во подключений на 80 и 25 порты.
export CONNECT80=$(/bin/netstat -plan | /bin/grep :80 | /bin/grep -c tcp)
export CONNECT25=$(/bin/netstat -plan | /bin/grep :25 | /bin/grep -c tcp)
#Подсчет кол-ва пакетов (Не траффика! См. Обсуждение!)
export TRAFFIC_IN=$(/bin/netstat -i | /bin/grep -m 1 'eth0' | /bin/awk {'print $4'})
export TRAFFIC_OUT=$(/bin/netstat -i | /bin/grep -m 1 'eth0' | /bin/awk {'print $8'})
#Теперь получим сколько у нас свободно памяти и СВАП
export MEM=$(/usr/bin/free -b | /bin/awk '/^Mem:/ { print $4; }')
export SWAP=$(/usr/bin/free -b | /bin/awk '/^Swap:/ { print $2; }')
#Считаем среднее значение пинга до нужного сервера, в качестве IP задаем нужный ip-адрес сервера или домен
export PINGIP=$(/bin/ping -q -c5 -i0.2 IP | /bin/awk -F\/ '/^rtt/ { print $5; }')
#Считаем занятость пространства у нужного раздела (напримеру у /dev/hda1 )
export DISK_USED=$(/bin/df | /bin/awk '/150390884/ { print $3; }')
#Считаем процент занятости процессора у user и system
export CPU_USER=$(/usr/bin/sar -u 1 | /bin/awk '/Среднее:/ { print $3; }')
export CPU_SYSTEM=$(/usr/bin/sar -u 1 | /bin/awk '/Среднее:/ { print $5;}')
#Ниже строки - только для проверки. Если каких-либо данных нет - смотрите внимательнее выше, где-то ошибка!
#echo $CONNETC80
#echo $CONNECT25
#echo $TRAFFIC_IN
#echo $TRAFFIC_OUT
#echo "mem" $MEM
#echo "SWAP" $SWAP
#echo $PINGIP
#echo $DISK_USED
#echo $CPU_USER
#echo $CPU_SYSTEM
# и все это отправляем в базу, если раскомментируем строки.
#mysql --user=$DB_USER --password=$DB_PASSWD -e "INSERT into имя базы.имя таблицы
#(`time_stat`, `traffic_in`, `traffic_out`, `connect80`, `connect25`, `memory`, `swap`, `used_root`, `cpu_user`, `cpu_system`, `ping`)
#values
#(NOW(), $TRAFFIC_IN, $TRAFFIC_OUT, $CONNECT80, $CONNECT25, $MEM, $SWAP, $DISK_USED, $CPU_USER, $CPU_SYSTEM, $PINGIP);"
exit 0
Структура таблицы, куда забрасываются данные
CREATE TABLE IF NOT EXISTS `smd` (
`emp_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`time_stat` datetime NOT NULL,
`traffic_in` int(11) DEFAULT NULL,
`traffic_out` int(11) DEFAULT NULL,
`connect80` int(11) DEFAULT NULL,
`connect25` int(11) DEFAULT NULL,
`memory` int(11) DEFAULT NULL,
`swap` int(11) DEFAULT NULL,
`used_root` int(11) DEFAULT NULL,
`cpu_user` int(11) DEFAULT NULL,
`cpu_system` int(11) DEFAULT NULL,
`ping` int(11) DEFAULT NULL,
PRIMARY KEY (`emp_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11799 ;
Страница просмотра
Вот тут то и сама засада - я не программист и сделать страницу, где бы можно было задать данные и в ответ получить график и средние значения, просто не умею. Поэтому пока просто смотрю нужное мне селектом в самой базе. Если же кто-то сможет написать страницу и выложить сюда её - это будет просто отлично и моё громадное спасибо!
См. так же: