搭建个人web监控系统

post by rocdk890 / 2013-9-4 9:23 Wednesday linux技术
  本文是根据开发自己的监控系统二、web篇来的,我只是加了几个简单的功能,来监控自己的vps,这样再也不用时时登录vps去看系统状态了,直接打开网页就可以了解自己vps的情况.具体的流程图如下:
点击查看原图
这个图是借的运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(一)里的,如果大家有兴趣也可以去看看这位大神做的监控系统,比本文要精细得多,当然个人使用的话我觉得没必要整那么精细了,可以看cpu、内存、硬盘、服务器存活时间就够了.
  系统:centos 5.9
1.在服务器上创建数据库名为monitor的数据库.
mysql -u root -p
create database monitor;
然后在monitor数据库创建一个servers表,用于存放监控数据:
use monitor
01create table servers (
02    id int not null primary key auto_increment,
03    hostname varchar(20),
04    ip varchar(64),
05    rootpartion varchar(64),
06    loadaverage varchar(64),
07    uptime varchar(64),
08    memory varchar(64),
09    Process varchar(64),
10    time timestamp
11)


上面创建这个表,要说明下:
hostname是存放服务器主机名.
ip是存放服务器ip.
rootpartion是存放服务器硬盘根目录的大小.
loadaverage是存放服务器cpu负载情况.
uptime是存放服务器存活时间.
memory是存放服务器内存使用情况.
Process是存放服务器进程数.

再给monitor数据库专门分配个用户来访问.
grant all privileges on monitor.* to 'dbmonitor'@'localhost' identified by '123456';
如果你要监控多个服务器的话,那就要给远程访问权限,命令如下:
grant all privileges on monitor.* to 'dbmonitor'@'%' identified by '123456';
最后刷新让其生效
flush privileges;

2.创建shell监控脚本
vi system_monitor.sh
01#!/bin/bash
02#Server status monitor
03  
04#初始化变量及设置阀值
05MYSQL="mysql -udbmonitor -p123456 monitor -e"     #数据库连接语句
06DIR="/tmp"
07NOW=$(date "+%F %T")
08>${DIR}/messages.txt
09  
10ADMIN="slogra@126.com" #你的邮箱地址
11HOSTNAME=$(hostname) #这里也可以手动指定服务器名  如:HOSTNAME="Server1"
12IP=$(ifconfig eth0|grep 'inet addr'|sed 's/.*addr:\(.*\) Bcast:.*/\1/')
13  
14loadaverage_MAX=3 #系统负载
15DISK_MAX=90 #磁盘使用率
16  
17#系统负载
18loadaverage=$(uptime|sed 's/^.*age: \(.*\)$/\1/')
19loadaverage_NOW=$(echo $loadaverage|awk -F. '{print $1}')
20if [ $loadaverage_NOW -ge $loadaverage_MAX ];then
21     echo "loadaverage: $loadaverage" >>${DIR}/messages.txt
22fi
23 
24#服务器存活时间
25UPTIME=$(uptime|awk '{print $3}')
26 
27#内存使用率
28memory=$(free -m | grep - | awk '{print $3}')
29#memory_total=$(free -m |grep Mem |awk '{print $2}')
30#[ "$memory" -ge "$memory_total" ] && $(echo "memory: $memory" >> ${DIR}/messages.txt)
31MemTotal=`free -m | grep Mem | awk -F: '{print $2}' | awk '{print $1}'`
32MemFree=`free -m | grep cache | awk NR==2 | awk '{print $4}'`
33MemFreeB=`awk 'BEGIN{printf "%.2f%\n",'$MemFree/$MemTotal\*100'}'`
34MemFreeS=`awk 'BEGIN{printf "%.f",'$MemFree/$MemTotal\*100'}'`
35if [ $MemFreeS -lt  20 ]
36then
37echo "系统可用内存小于20%,实际可用内存为:$MemFreeB ,请查看。">>${DIR}/messages.txt
38else
39echo "Mem OK" >/dev/null
40fi
41 
42#总进程
43Process=$(ps -ef |wc -l)
44if [ $Process -gt 200 ]
45then
46echo "系统总进程已经超过200,目前进程数位: $Process ,请查看.">>${DIR}/messages.txt
47else
48echo "Process is ok!">/dev/null
49fi
50 
51#根分区
52#DISK=$(df -h|grep /$|awk '{print $5,$2,$4}')
53#DISK=$(df -h|grep /$|awk '{print $4,$2}')
54#DISK_USAGE=$(echo $DISK|awk '{print $1}'|tr -d '%')
55DISK=$(df -hP|grep /$|awk '{print $5,$2,$4}')
56DISK_USAGE=$(echo $DISK|awk '{print $1}'|tr -d '%')
57[ "$DISK_USAGE" -ge "$DISK_MAX" ] && $(echo "DISK: $DISK" >> ${DIR}/messages.txt)
58  
59#如果messages.txt文件不为空则发送警报信
60if [ -s ${DIR}/messages.txt ];then
61     mutt -s "system monitor: $NOW  $IP  $HOSTNAME" "$ADMIN" < ${DIR}/messages.txt
62fi
63  
64#将服务器运行状态数据入到mysql数据库中
65#第一次执行插入一条新记录,后续则更新记录
66if [ -n "$1" ];then
67     $MYSQL "insert into servers(hostname,ip,rootpartion,loadaverage,uptime,memory,Process,time) values('$HOSTNAME','$IP','$DISK','$loadaverage','$UPTIME','$memory','$Process',now())"
68else
69     $MYSQL "update servers set rootpartion='$DISK',loadaverage='$loadaverage',uptime='$UPTIME',memory='$memory',Process='$Process',time=now() where hostname='$HOSTNAME'"
70fi


3.创建php在web浏览器上显示
01<html>
02    <head>
03        <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
04        <meta http-equiv="refresh" content="60">
05        <title>my servers</title>
06    </head>
07     <body>
08            <h2>My servers</h2>
09        <table border='1'>
10               <tr>
11                    <th>id</th>
12                    <th>hostname</th>
13                    <th>ip</th>
14                    <th>rootpartion</th>
15                    <th>loadaverage</th>
16                    <th>uptime</th>
17                    <th>memory</th>
18                    <th>Process</th>
19                    <th>time</th>
20               </tr>
21        <?php
22            //1、连接并选择数据库
23            $link=@mysql_connect("127.0.0.1","dbmonitor","123456") or die("连接数据库失败");
24            mysql_select_db("monitor",$link);
25            //2、构造sql语句并执行,返回结果集
26            $sql="select * from servers";
27            $res=mysql_query($sql,$link);
28            //3、遍历解析结果集
29            while($rows=mysql_fetch_assoc($res)){
30                echo "<tr>";
31                echo "<td>${rows['id']}</td>";
32                echo "<td>${rows['hostname']}</td>";
33                echo "<td>${rows['ip']}</td>";
34                echo "<td>${rows['rootpartion']}</td>";
35                echo "<td>${rows['loadaverage']}</td>";
36                echo "<td>${rows['uptime']}</td>";
37                echo "<td>${rows['memory']}</td>";
38                echo "<td>${rows['Process']}</td>";
39                echo "<td>${rows['time']}</td>";
40                echo "";
41            }
42        ?>
43          </table>
44     </body>
45</html>


4.使用方法
第一次执行system_monitor.sh的要使用下面的命令
./system_monitor.sh 1
这样才能在mysql里有数据,不然无法读取到,以后就可以直接:
./system_monitor.sh

然后在系统任务计划里配置如下:
*/1 * * * * /bin/sh /root/soft_shell/system_monitor.sh
让监控脚本每分钟执行一次.

5.验证
如图,我就不写了.
点击查看原图
可以看到是有数据出来的,证明个人的web监控系统已经搭建成功了.
夜空- 本站版权
1、本站所有主题由该文章作者发表,该文章作者与夜空享有文章相关版权
2、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和夜空的同意
3、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
5、原文链接:blog.slogra.com/post-433.html

标签: mysql php 系统 shell 脚本 监控

评论:

正在载入...