免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1078 | 回复: 0
打印 上一主题 下一主题

本周写的“Linux服务器监控系统 ServMon V1.0”[原创] 大 | 中 | 小 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-02 14:10 |只看该作者 |倒序浏览
本周写的“Linux服务器监控系统 ServMon V1.0”[原创] 大 | 中 | 小
[文章作者:张宴 本文版本:v1.1 最后修改:2007.08.31 转载请注明出处:
http://blog.s135.com
]
  8月3日,我写了“Linux服务器监控系统 ServMon V1.0”,今天,ServMon V1.1 版本亮相。
  ServMon的原理是用shell脚本定时抓取被监控Linux服务器上的信息,再用curl POST到监控机的PHP接口程序上,由PHP接口程序对信息进行分析,如果存在异常,则发送报警邮件给管理员。报警邮件演示页面请见:
http://blog.s135.com/read.php/276.htm
  

  ServMon V1.1 在 1.0 的基础上,增加了对Linux系统负载的监控,并编写了客户端自动安装包:
  1、被监控端服务器(Linux)
  (1)、下载并安装ServMon Client
引用
wget
http://blog.s135.com/soft/linux/servmon/servmon-1.1.linux.tar.gz
tar zxvf servmon-1.1.linux.tar.gz
cd servmon-1.1
./install -i
http://yourdomain/servmon/interface.php
password
  注:此处的password为interface.php程序中设置的数据传输验证密码。
  客户端安装包源码:
  │
  ├─
install
  ├─[src]
  │  ├─[bin]
  │  │  ├─
diskstat_send
  │  │  ├─
loadstat_send
  │  │  └─
swapstat_send
  │  ├─[cron]
  │  │  └─
servmon
  │  └─[data]
  屏幕演示:
  

  2、监控端服务器配置(Linux)
  (1)、启动sendmail
  /usr/sbin/sendmail -bd -q30m
  -b:指定Sendmail在后台运行,并且监听端口25的请求。
  -d:指定Sendmail以Daemon方式运行(守护进程)。
  -q:当Sendmail无法将邮件成功地发送到目的地时,它会将邮件保存在队列里。该参数指定邮件在队列里保存的时间。其中的30m表示保留30分钟。
  (2)、修改php.ini的[mail function]部分为以下内容,然后重启Apache,使PHP能够使用mail()函数发送电子邮件
引用
[mail function]
; For Win32 only.
;SMTP = localhost
;smtp_port = 25
; For Win32 only.
;sendmail_from = me@example.com
; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = /usr/sbin/sendmail -t -i
  (4)、在MySQL上创建一个数据库servmon,然后在该数据库中执行以下SQL语句创建表:
引用
CREATE TABLE `tb_diskstat` (
`ip` varchar(128) NOT NULL default '',
`date` int(10) NOT NULL default '0',
UNIQUE KEY `ip` (`ip`)
) TYPE=MyISAM;
  备注:这张表是PHP接口程序用来记录发送磁盘分区报警邮件的时间,避免在一段时间内重复发送大量报警邮件的。
  (3)、PHP接口程序
  
http://yourdomain/servmon/interface.php
view plain
copy to clipboard
print
?

/**     
*********************************************************************     
* Copyright (c) 2007, 回忆未来[张宴]     
* All rights reserved.     
*     
* 文件名称: interface.php     
* 摘    要: 服务器监控系统ServMon接口程序     
* 描    述:     
* 作    者: 张宴  新浪UC:103500  博客:blog.s135.com     
* 版    本: 1.1     
* 时    间: 2007-08-31     
*********************************************************************     
*/      
      
//------------------配置信息------------------      
$password = "yourpassword";//设置数据传输验证密码,ServMon客户端安装时需要指定此密码      
$mysql_server = "127.0.0.1:3306";//MySQL服务器地址及端口,例如localhost:3306      
$mysql_db = "servmon";//MySQL数据库名      
$mysql_username = "root";//MySQL帐号      
$mysql_password = "";//MySQL密码      
$disk_max = "90";//磁盘分区使用百分比超过此值,则报警。默认为90%      
$disk_sendmail_interval = "43200";//如果同一台服务器连续报警,设置每隔多少秒发送一次报警邮件。默认为43200秒,即12小时。      
$swap_max = "50";//Swap交换空间使用百分比超过此值,则报警。默认为50%      
$email = "webmaster@s135.com,info@s135.com";//管理员邮箱,多个邮箱以逗号分割      
//--------------------------------------------      
   
//密码验证   
if (htmlspecialchars($_POST["password"]) != $password)   
{   
    echo "数据传输验证密码错误!\n";   
    exit();   
}   
   
//磁盘分区报警(分区使用率超过90%后会发邮件报警)   
if (htmlspecialchars($_POST["menu"]) == "diskstat")   
{   
    $is_send_mail = "0";//是否发邮件,0为不发邮件   
    $date = htmlspecialchars($_POST["date"]);   
    $ip = htmlspecialchars($_POST["ip"]);   
    $data = htmlspecialchars($_POST["data"]);   
    $arr1 = explode(";", $data);   
    foreach ($arr1 as $key1 => $value1)   
    {   
        $arr2 = explode(":", $value1);   
        if ($arr2[0] != "" && $arr2[1] != "" && $arr2[1] >= $disk_max)   
        {   
            $subject = "[系统监控]_磁盘分区空间不足_" . $ip;   
            $message = "服务器监控系统 ServMon V1.1\r\n";   
            $message = $message . "-------------------------------------------------------\r\n";   
            $message = $message . "报警服务器:" . $ip . "\r\n";   
            $message = $message . "-------------------------------------------------------\r\n";   
            $message = $message . "报警时间:" . $date . "\r\n";   
            $message = $message . "-------------------------------------------------------\r\n";   
            $message = $message . "报警内容:\r\n";   
            $message = $message . "●磁盘分区 " . $arr2[0] . " 空间不足(空间使用率达到" . $arr2[1] . "%)\r\n";   
            $headers = 'From: ServMon ' . "\r\n" .   
                'Reply-To: ServMon ' . "\r\n" . 'X-Mailer: PHP/' . phpversion();   
            $is_send_mail = "1";//是否发邮件,1为发送邮件   
        }   
    }   
    if ($is_send_mail == "1")   
    {   
        $connect = mysql_connect($mysql_server, $mysql_username, $mysql_password);   
        $select = mysql_select_db($mysql_db, $connect);   
        $select_result = mysql_query("SELECT date FROM tb_diskstat WHERE ip='" . $ip .   
            "' LIMIT 1");   
        $rs = mysql_fetch_array($select_result);   
        $interval = date("U") - $rs["date"];   
        if ($interval >= $disk_sendmail_interval)   
        {   
            if (mail($email, $subject, $message, $headers))   
            {   
                echo "已成功发送报警邮件!\n";   
            }   
            else   
            {   
                echo "发送报警邮件失败!\n";   
            }   
            $insert_result = mysql_query("REPLACE INTO tb_diskstat (ip, date) VALUES ('" . $ip .   
                "', '" . date("U") . "');");   
        }   
        else   
        {   
            if ($disk_sendmail_interval >= 3600)   
            {   
                $disk_sendmail_interval_text = $disk_sendmail_interval / 3600 . "小时";   
            }   
            else   
            {   
                $disk_sendmail_interval_text = $disk_sendmail_interval . "秒";   
            }   
            echo "已发送过报警邮件," . $disk_sendmail_interval_text . "内不再重复发送!\n";   
        }   
   
    }   
    else   
    {   
        echo "磁盘分区空间足够,无须发送报警邮件!\n";   
    }   
    exit();   
}   
   
//Swap交换空间报警(Swap交换空间使用率超过60%后会发邮件报警)   
if (htmlspecialchars($_POST["menu"]) == "swapstat")   
{   
    $is_send_mail = "0";//是否发邮件,0为不发邮件   
    $date = htmlspecialchars($_POST["date"]);   
    $ip = htmlspecialchars($_POST["ip"]);   
    list($total, $used, $free) = split(":", htmlspecialchars($_POST["data"]));   
    $percentage = round($used / $total * 100, 0);   
    if ($percentage >= $swap_max)   
    {   
        $subject = "[系统监控]_Swap交换空间使用率高达" . $percentage . "%_" . $ip;   
        $message = "服务器监控系统 ServMon V1.1\r\n";   
        $message = $message . "-------------------------------------------------------\r\n";   
        $message = $message . "报警服务器:" . $ip . "\r\n";   
        $message = $message . "-------------------------------------------------------\r\n";   
        $message = $message . "报警时间:" . $date . "\r\n";   
        $message = $message . "-------------------------------------------------------\r\n";   
        $message = $message . "报警内容:\r\n";   
        $message = $message . "●Swap交换空间使用率高达" . $percentage . "%,若继续增加到100%可能会导致服务器死机。\r\n";   
        $message = $message . "●Swap交换空间总量:" . $total . " MB\r\n";   
        $message = $message . "●Swap交换空间使用:" . $used . " MB\r\n";   
        $message = $message . "●Swap交换空间剩余:" . $free . " MB\r\n";   
        $headers = 'From: ServMon ' . "\r\n" .   
            'Reply-To: ServMon ' . "\r\n" . 'X-Mailer: PHP/' . phpversion();   
        $is_send_mail = "1";//是否发邮件,1为发送邮件   
    }   
    if ($is_send_mail == "1")   
    {   
        if (mail($email, $subject, $message, $headers))   
        {   
            echo "已成功发送报警邮件!\n";   
        }   
        else   
        {   
            echo "发送报警邮件失败!\n";   
        }   
    }   
    else   
    {   
        echo "Swap交换空间使用率不高,无须发送报警邮件!\n";   
    }   
    exit();   
}   
   
//系统负载过高报警   
if (htmlspecialchars($_POST["menu"]) == "loadstat")   
{   
    $is_send_mail = "0";//是否发邮件,0为不发邮件   
    $date = htmlspecialchars($_POST["date"]);   
    $ip = htmlspecialchars($_POST["ip"]);   
    list($load_last_1min, $load_last_5min, $load_last_15min) = split(",",   
        htmlspecialchars($_POST["data"]));   
    if ($load_last_15min >= 25)   
    {   
        if ($load_last_15min  
        {   
            $level = "轻微";   
        }   
        elseif ($load_last_15min  
        {   
            $level = "严重";   
        }   
        elseif ($load_last_15min  
        {   
            $level = "非常严重";   
        }            
        else   
        {   
            $level = "接近崩溃";   
        }   
        $subject = "[系统监控]_系统负载过高(" . $level . ")_" . $ip;   
        $message = "服务器监控系统 ServMon V1.1\r\n";   
        $message = $message . "-------------------------------------------------------\r\n";   
        $message = $message . "报警服务器:" . $ip . "\r\n";   
        $message = $message . "-------------------------------------------------------\r\n";   
        $message = $message . "报警时间:" . $date . "\r\n";   
        $message = $message . "-------------------------------------------------------\r\n";   
        $message = $message . "报警内容:\r\n";   
        $message = $message . "●系统负载过高,级别:" . $level . " (25~50轻微、50~100严重、100~500非常严重、>500接近崩溃)\r\n";   
        $message = $message . "●最近 1分钟系统负载:" . $load_last_1min . "\r\n";   
        $message = $message . "●最近 5分钟系统负载:" . $load_last_5min . "\r\n";   
        $message = $message . "●最近15分钟系统负载:" . $load_last_15min . "\r\n";   
        $headers = 'From: ServMon ' . "\r\n" .   
            'Reply-To: ServMon ' . "\r\n" . 'X-Mailer: PHP/' . phpversion();   
        $is_send_mail = "1";//是否发邮件,1为发送邮件   
    }   
    if ($is_send_mail == "1")   
    {   
        if (mail($email, $subject, $message, $headers))   
        {   
            echo "已成功发送报警邮件!\n";   
        }   
        else   
        {   
            echo "发送报警邮件失败!\n";   
        }   
    }   
    else   
    {   
        echo "系统负载不高,无须发送报警邮件!\n";   
    }   
    exit();   
}   
?>   $value1)
    {
        $arr2 = explode(":", $value1);
        if ($arr2[0] != "" && $arr2[1] != "" && $arr2[1] >= $disk_max)
        {
            $subject = "[系统监控]_磁盘分区空间不足_" . $ip;
            $message = "服务器监控系统 ServMon V1.1\r\n";
            $message = $message . "-------------------------------------------------------\r\n";
            $message = $message . "报警服务器:" . $ip . "\r\n";
            $message = $message . "-------------------------------------------------------\r\n";
            $message = $message . "报警时间:" . $date . "\r\n";
            $message = $message . "-------------------------------------------------------\r\n";
            $message = $message . "报警内容:\r\n";
            $message = $message . "●磁盘分区 " . $arr2[0] . " 空间不足(空间使用率达到" . $arr2[1] . "%)\r\n";
            $headers = 'From: ServMon ' . "\r\n" .
                'Reply-To: ServMon ' . "\r\n" . 'X-Mailer: PHP/' . phpversion();
            $is_send_mail = "1";//是否发邮件,1为发送邮件
        }
    }
    if ($is_send_mail == "1")
    {
        $connect = mysql_connect($mysql_server, $mysql_username, $mysql_password);
        $select = mysql_select_db($mysql_db, $connect);
        $select_result = mysql_query("SELECT date FROM tb_diskstat WHERE ip='" . $ip .
            "' LIMIT 1");
        $rs = mysql_fetch_array($select_result);
        $interval = date("U") - $rs["date"];
        if ($interval >= $disk_sendmail_interval)
        {
            if (mail($email, $subject, $message, $headers))
            {
                echo "已成功发送报警邮件!\n";
            }
            else
            {
                echo "发送报警邮件失败!\n";
            }
            $insert_result = mysql_query("REPLACE INTO tb_diskstat (ip, date) VALUES ('" . $ip .
                "', '" . date("U") . "');");
        }
        else
        {
            if ($disk_sendmail_interval >= 3600)
            {
                $disk_sendmail_interval_text = $disk_sendmail_interval / 3600 . "小时";
            }
            else
            {
                $disk_sendmail_interval_text = $disk_sendmail_interval . "秒";
            }
            echo "已发送过报警邮件," . $disk_sendmail_interval_text . "内不再重复发送!\n";
        }
    }
    else
    {
        echo "磁盘分区空间足够,无须发送报警邮件!\n";
    }
    exit();
}
//Swap交换空间报警(Swap交换空间使用率超过60%后会发邮件报警)
if (htmlspecialchars($_POST["menu"]) == "swapstat")
{
    $is_send_mail = "0";//是否发邮件,0为不发邮件
    $date = htmlspecialchars($_POST["date"]);
    $ip = htmlspecialchars($_POST["ip"]);
    list($total, $used, $free) = split(":", htmlspecialchars($_POST["data"]));
    $percentage = round($used / $total * 100, 0);
    if ($percentage >= $swap_max)
    {
        $subject = "[系统监控]_Swap交换空间使用率高达" . $percentage . "%_" . $ip;
        $message = "服务器监控系统 ServMon V1.1\r\n";
        $message = $message . "-------------------------------------------------------\r\n";
        $message = $message . "报警服务器:" . $ip . "\r\n";
        $message = $message . "-------------------------------------------------------\r\n";
        $message = $message . "报警时间:" . $date . "\r\n";
        $message = $message . "-------------------------------------------------------\r\n";
        $message = $message . "报警内容:\r\n";
        $message = $message . "●Swap交换空间使用率高达" . $percentage . "%,若继续增加到100%可能会导致服务器死机。\r\n";
        $message = $message . "●Swap交换空间总量:" . $total . " MB\r\n";
        $message = $message . "●Swap交换空间使用:" . $used . " MB\r\n";
        $message = $message . "●Swap交换空间剩余:" . $free . " MB\r\n";
        $headers = 'From: ServMon ' . "\r\n" .
            'Reply-To: ServMon ' . "\r\n" . 'X-Mailer: PHP/' . phpversion();
        $is_send_mail = "1";//是否发邮件,1为发送邮件
    }
    if ($is_send_mail == "1")
    {
        if (mail($email, $subject, $message, $headers))
        {
            echo "已成功发送报警邮件!\n";
        }
        else
        {
            echo "发送报警邮件失败!\n";
        }
    }
    else
    {
        echo "Swap交换空间使用率不高,无须发送报警邮件!\n";
    }
    exit();
}
//系统负载过高报警
if (htmlspecialchars($_POST["menu"]) == "loadstat")
{
    $is_send_mail = "0";//是否发邮件,0为不发邮件
    $date = htmlspecialchars($_POST["date"]);
    $ip = htmlspecialchars($_POST["ip"]);
    list($load_last_1min, $load_last_5min, $load_last_15min) = split(",",
        htmlspecialchars($_POST["data"]));
    if ($load_last_15min >= 25)
    {
        if ($load_last_15min 500接近崩溃)\r\n";
        $message = $message . "●最近 1分钟系统负载:" . $load_last_1min . "\r\n";
        $message = $message . "●最近 5分钟系统负载:" . $load_last_5min . "\r\n";
        $message = $message . "●最近15分钟系统负载:" . $load_last_15min . "\r\n";
        $headers = 'From: ServMon ' . "\r\n" .
            'Reply-To: ServMon ' . "\r\n" . 'X-Mailer: PHP/' . phpversion();
        $is_send_mail = "1";//是否发邮件,1为发送邮件
    }
    if ($is_send_mail == "1")
    {
        if (mail($email, $subject, $message, $headers))
        {
            echo "已成功发送报警邮件!\n";
        }
        else
        {
            echo "发送报警邮件失败!\n";
        }
    }
    else
    {
        echo "系统负载不高,无须发送报警邮件!\n";
    }
    exit();
}
?>
Tags:
linux


纯粹技术
|
评论(10)
|
引用(0)
|
阅读(3892)

引用地址:
注意: 该地址仅在今日23:59:59之前有效
各有所志
2007-9-3 07:26
唉,做程序员难以快速致富,我决定改行……没听说过上海开宝马车的都是做销售吗?虽然开始苦了点,过几年就好了……到时车子、房子、女人都有了
张宴
回复于 2007-9-3 14:59
做销售提成高,做技术只靠工资+奖金,不过做自己喜欢的工作也是一种乐趣。我的房子买了,两年后才能入住;车要求不高,以后先买个QQ车当1.0版本,有钱了再升级;女朋友,最终版,就差结婚了。
marcolu
2007-9-3 11:00
呵呵,我用perl写了个和你差不多Linux监控系统,有时间可以交流一下:)
张宴
回复于 2007-9-3 15:01
欢迎,我UC号103500
jackbillow

2007-9-3 13:55
不错!
DD
2007-9-4 11:02
您的1.1版本比1.0版本功能是不是只增加了:系统负载过高报警?请问能否监控MySQL,系统重要进程的活动么?
DD
2007-9-4 11:13
您的1.1版本比1.0版本功能是不是只增加了:系统负载过高报警?
问题:
1.能否把某个时间某个系统报警时(不管是CPU或是内存等,至少有一个达到报警情况),把系统CPU,内存,Swap,磁盘等信息收集在一起再同时发Email呢?(因为如果CPU报警了,我还想知道此时的内存或其他系统运行情况)
2.能否监控MySQL,系统重要进程的活动么?
3.期待您写的1.2版本.因为我也从事这....
4.谢谢...
冯伟国
2007-9-4 15:35
这个监控程序写的不错.不过我的是用发短信息形式提醒的而已,呵呵,大体原理相同.你的这个里面也有很多值得学习的地方
marcolu


2007-9-29 14:11
我现在想修改我监控页面的主页面,想用php实现,如果你有时间可以共同完成。
具体可以看我的主页:
http://www.mumonitor.com

斜阳
2007-12-6 17:27
您好,我的密码都正确,但输入
http://www.domain.com/servmon/interface.php
出现下面的错误,
数据传输验证密码错误!
但我在客户机上执行都没问题,如下
/bin/sh /usr/local/servmon/bin/loadstat_send
http://192.168.2.239/servmon/interface.php
password
系统负载不高,无须发送发警信息
不知为何在ie中访问就不行呢,望指点
小新




2008-4-22 19:32
我的也是
http://www.domain.com/servmon/interface.php
出现下面的错误,
数据传输验证密码错误!
安装时和php文件中设置的密码肯定一样,文件的权限也修改了。但是还是不行。咋回事呢???
笑笑
2008-6-19 16:59
和不用nagios?


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/41660/showart_1071284.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP