标签归档:服务器监控

LINUX内存监控

 #!/bin/bash    
    #  
    # 监控内存使用状态 以便做出响应,可以添加到/etc/rc.local中作为守护进程脚本运行    
    #  
    # free#              total       used       free     shared    buffers     cached  
    # Mem:       2074716     702972    1371744          0     123612     478028  
    # -/+ buffers/cache:     101332    1973384  
    # Swap:      4088532          0    4088532   
    #  
    MINRATIO="0.05" 
    #while true  
    while :  
    do  
        MemTotal=`free|grep "Mem"|awk '{ print $2 }'`  
        MemFree=`free|grep "Mem"|awk '{ print $4 }'`  
        Result=`echo | awk '{ print "'$MemFree'" / "'$MemTotal'" }'`  
        RetVal=`awk 'BEGIN { print ("'$Result'" < "'$MINRATIO'"); }'`  
     
        if [ ${RetVal} -eq 1 ]; then  
        #    echo "Restart Apache"  
            /usr/local/apache/bin/apachectl restart  
        fi  
        sleep 60  
    done 

继续阅读

Linux服务器监控系统

  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

    <?php     
    /**    
    *********************************************************************    
    * 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 <servmon@sina.com>' . "\r\n" .  
                    'Reply-To: ServMon <servmon@sina.com>' . "\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 <servmon@sina.com>' . "\r\n" .  
                'Reply-To: ServMon <servmon@sina.com>' . "\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 < 50)  
            {  
                $level = "轻微";  
            }  
            elseif ($load_last_15min < 100)  
            {  
                $level = "严重";  
            }  
            elseif ($load_last_15min < 500)  
            {  
                $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 <servmon@sina.com>' . "\r\n" .  
                'Reply-To: ServMon <servmon@sina.com>' . "\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();  
    }  
    ?> 

  [文章作者:张宴 本文版本:v1.1 最后修改:2007.08.31 转载请注明出处:http://blog.s135.com]

最近,在我原有的“Linux服务器系统监控程序”基础上,完善了HTTP、TCP、MySQL主动监控与MSN、E-mail、手机短信报警。监控程序以shell和PHP程序编写,以下为主要框架与部分代码:

  一、系统监控接口程序(interface.php)具有的报警方式
  1、MSN实时报警
  ①、监控程序每次检测到故障存在、或者故障恢复,都会发送短消息到管理员的MSN。
点击在新窗口中浏览此图片

点击在新窗口中浏览此图片

  发送MSN短消息用了一个PHP类:sendMsg,使用该PHP类发消息,必须将发送、接收双方的MSN加为联系人,发送中文时,先用iconv将字符集转为UTF-8:
$sendMsg->sendMessage(iconv("GBK", "UTF-8", $message), 'Times New Roman', '008000');

  2、手机短信报警
  ①、工作日早上10点之前,晚上6点之后,以及周六、周日,监控程序检测到故障,会调用手机短信接口,发送短信给管理员的手机。
  ②、如果监控程序多次检测到同一台服务器的同一类故障,只会在第一次检测到故障时发送一条“故障报警”短信。服务器故障恢复后,监控程序会再发送一条“故障恢复”短信。

  如果没有手机短信网关接口,可以试试中国移动通信的www.139.com邮箱,具有免费的邮件到达手机短信通知功能,可以将收到的邮件标题以短信的形式发送到手机上。

  3、电子邮件报警
  ①、如果监控程序多次检测到同一台服务器的同一类故障,只会在第一次检测到故障时发送一封“故障报警”邮件。服务器故障恢复后,监控程序会再发送一封“故障恢复”邮件。

  系统监控接口程序interface.php(核心部分,仅提供部分代码):

    <?php  
    //HTTP服务器监控  
    if (htmlspecialchars($_POST["menu"]) == "http")     
    {     
        $date = htmlspecialchars($_POST["date"]);     
        $ip = htmlspecialchars($_POST["ip"]);  
        $port = htmlspecialchars($_POST["port"]);  
        $status = htmlspecialchars($_POST["status"]);//状态,0表示无法访问,1表示正常,2表示无法访问但能ping通  
        //...下一步处理(省略)...    
    }  
     
    //TCP服务器监控  
    if (htmlspecialchars($_POST["menu"]) == "tcp")     
    {     
        $date = htmlspecialchars($_POST["date"]);     
        $ip = htmlspecialchars($_POST["ip"]);  
        $port = htmlspecialchars($_POST["port"]);  
        $status = htmlspecialchars($_POST["status"]);//状态,0表示无法访问,1表示正常,2表示无法访问但能ping通  
        //...下一步处理(省略)...  
    }  
     
    //MySQL服务器监控  
    if (htmlspecialchars($_POST["menu"]) == "mysql")     
    {     
        $date = htmlspecialchars($_POST["date"]);     
        $ip = htmlspecialchars($_POST["ip"]);  
        $port = htmlspecialchars($_POST["port"]);  
        $abstract = htmlspecialchars($_POST["abstract"]);//故障摘要(必须为全角)  
        $info = htmlspecialchars($_POST["info"]);//故障详细描述  
        $failback = htmlspecialchars($_POST["failback"]);//如果服务器存活,此处接收的值为active  
        //...下一步处理(省略)...  
    }  
    ?> 

二、主动探测监控(“监控机”主动探测“被监控机”)
  1、HTTP服务器监控
  脚本:/data0/monitor/http.sh

    #!/bin/sh  
    LANG=C  
     
    #被监控服务器、端口列表  
    server_all_list=(\  
    192.168.1.1:80 \  
    192.168.1.2:80 \  
    192.168.1.3:80 \  
    )  
     
    date=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")  
     
    #采用HTTP POST方式发送检测信息给接口程序interface.php,接口程序负责分析信息,决定是否发送报警MSN消息、手机短信、电子邮件。  
    send_msg_to_interface()  
    {  
       /usr/bin/curl -m 600 -d menu=http -d date=$date -d ip=$server_ip -d port=$server_port -d status=$status http://127.0.0.1:8888/interface.php  
    }  
     
    server_all_len=${#server_all_list[*]}  
    i=0  
    while  [ $i -lt $server_all_len ]  
    do  
       server_ip=$(echo ${server_all_list[$i]} | awk -F ':' '{print $1}')  
       server_port=$(echo ${server_all_list[$i]} | awk -F ':' '{print $2}')  
       if curl -m 10 -G http://${server_all_list[$i]}/ > /dev/null 2>&1  
       then  
         #status:    0,http down    1,http ok    2,http down but ping ok   
         status=1  
               echo "服务器${server_ip},端口${server_port}能够正常访问!"  
       else  
           if curl -m 30 -G http://${server_all_list[$i]}/ > /dev/null 2>&1  
           then  
               status=1  
               echo "服务器${server_ip},端口${server_port}能够正常访问!"  
           else  
               if ping -c 1 $server_ip > /dev/null 2>&1  
               then  
                   status=2  
                   echo "服务器${server_ip},端口${server_port}无法访问,但是能够Ping通!"  
               else  
                   status=0  
                   echo "服务器${server_ip},端口${server_port}无法访问,并且无法Ping通!"  
               fi  
           fi  
       fi  
     send_msg_to_interface  
       let i++  
    done  

  2、TCP服务器监控
  脚本:/data0/monitor/tcp.sh

    #!/bin/sh  
    LANG=C  
     
    #被监控服务器、端口列表  
    server_all_list=(\  
    192.168.1.4:11211 \  
    192.168.1.5:11211 \  
    192.168.1.6:25 \  
    192.168.1.7:25 \  
    )  
     
    date=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")  
     
    #采用HTTP POST方式发送检测信息给接口程序interface.php,接口程序负责分析信息,决定是否发送报警MSN消息、手机短信、电子邮件。  
    send_msg_to_interface()  
    {  
       /usr/bin/curl -m 600 -d menu=tcp -d date=$date -d ip=$server_ip -d port=$server_port -d status=$status http://127.0.0.1:8888/interface.php  
    }  
     
    server_all_len=${#server_all_list[*]}  
    i=0  
    while  [ $i -lt $server_all_len ]  
    do  
       server_ip=$(echo ${server_all_list[$i]} | awk -F ':' '{print $1}')  
       server_port=$(echo ${server_all_list[$i]} | awk -F ':' '{print $2}')  
       if nc -vv -z -w 3 $server_ip $server_port > /dev/null 2>&1  
       then  
           #status:    0,http down    1,http ok    2,http down but ping ok   
           status=1  
           echo "服务器${server_ip},端口${server_port}能够正常访问!"  
       else  
           if nc -vv -z -w 10 $server_ip $server_port > /dev/null 2>&1  
           then  
               status=1  
               echo "服务器${server_ip},端口${server_port}能够正常访问!"  
           else  
               if ping -c 1 $server_ip > /dev/null 2>&1  
               then  
                   status=2  
                   echo "服务器${server_ip},端口${server_port}无法访问,但是能够Ping通!"  
               else  
                   status=0  
                   echo "服务器${server_ip},端口${server_port}无法访问,并且无法Ping通!"  
               fi  
           fi  
       fi  
       send_msg_to_interface  
       let i++  
    done  

  3、MySQL服务器监控
  ①、MySQL是否能够连接
  ②、MySQL是否发生表损坏等错误
  ③、MySQL活动连接数是否过多
  ④、MySQL从库是否同步正常
  ⑤、MySQL从库同步延迟时间是否过大
  脚本:/data0/monitor/mysql.php

    <?php  
    //$server_list[]="服务器地址:端口:帐号:密码";  
    $server_list[]="192.168.1.11:3306:root:password";  
    $server_list[]="192.168.1.12:3306:root:password";  
    $server_list[]="192.168.1.13:3306:root:password";  
     
    $database="mysql";  
     
    $curl = new Curl_Class();   
     
    foreach ($server_list as $server) {  
        $status=1;//初始化,正常状态  
      unset($data);  
        $data["menu"] = "mysql";  
      $data["info"] = "";  
        list($data["ip"], $data["port"], $username, $password) = explode(":", $server);  
     
        $connect = @mysql_connect($data["ip"].":".$data["port"], $username, $password);  
        if(! $connect)  
        {  
            $status=0;  
            $data["info"] = $data["info"] . "无法连接MySQL服务器\r\n";  
        }  
        
        $select = @mysql_select_db($database, $connect);  
        $result = @mysql_query("show slave status");  
        $rs_slave = @mysql_fetch_array($result);  
        $result = @mysql_query("show global status like 'Threads_running'");  
        $rs_threads = @mysql_fetch_array($result);  
        if($rs_slave["Slave_SQL_Running"] == "No")  
        {  
            $status=0;//故障状态  
            $data["abstract"] = "从库不同步";  
            $data["info"] = $data["info"] . "Slave_SQL_Running = No\r\n";    
        }  
        if($rs_slave["Slave_IO_Running"] == "No")  
        {  
            $status=0;  
            $data["abstract"] = "从库不同步";  
            $data["info"] = $data["info"] . "Slave_IO_Running = No\r\n";    
        }  
        if($rs_slave["Last_Error"] != "")  
        {  
            $status=0;  
            $data["abstract"] = "从库同步出错";  
            $data["info"] = $data["info"] . "Last_Error = ".substr($rs_slave["Last_Error"], 0, 40)."\r\n";  
        }  
        if($rs_slave["Seconds_Behind_Master"] > 180)  
        {  
            $status=0;  
            $data["abstract"] = "从库同步延迟时间高达".$rs_slave["Seconds_Behind_Master"]."秒";  
            $data["info"] = $data["info"] . "Seconds_Behind_Master = ".$rs_slave["Seconds_Behind_Master"]."\r\n";  
        }  
        if($rs_threads["Value"] > 60)  
        {  
            $status=0;  
            $data["abstract"] = "活动连接数多达".$rs_threads["Value"];  
            $data["info"] = $data["info"] . "Threads_running = ".$rs_threads["Value"]."\r\n";  
        }  
     
        $data["date"] = date("Y-m-d_H:i:s");  
        if($status == 0)  
        {  
            $post = @$curl->post("http://127.0.0.1:8888/interface.php", $data);  
            echo "MySQL服务器“".$data["ip"].":".$data["port"]."”发生故障!\n";  
            print_r($post);        
        }  
        else 
        {  
            $data["failback"] = "active";//服务器正常,发送通知信息  
            $post = @$curl->post("http://127.0.0.1:8888/interface.php", $data);  
            echo "MySQL服务器“".$data["ip"].":".$data["port"]."”运行正常!\n";  
            print_r($post);  
        }  
    }  
     
    /**  
    *********************************************************************  
    * Curl_Class :curl 类  
    *********************************************************************/ 
    class Curl_Class  
    {  
        function Curl_Class()  
        {  
            return true;  
        }  
     
        function execute($method, $url, $fields = '', $userAgent = '', $httpHeaders = '',  
            $username = '', $password = '')  
        {  
            $ch = Curl_Class::create();  
            if (false === $ch)  
            {  
                return false;  
            }  
     
            if (is_string($url) && strlen($url))  
            {  
                $ret = curl_setopt($ch, CURLOPT_URL, $url);  
            }  
            else 
            {  
                return false;  
            }  
            //是否显示头部信息  
            curl_setopt($ch, CURLOPT_HEADER, false);  
            //  
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
     
            if ($username != '')  
            {  
                curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);  
            }  
     
            $method = strtolower($method);  
            if ('post' == $method)  
            {  
                curl_setopt($ch, CURLOPT_POST, true);  
                if (is_array($fields))  
                {  
                    $sets = array();  
                    foreach ($fields as $key => $val)  
                    {  
                        $sets[] = $key . '=' . urlencode($val);  
                    }  
                    $fields = implode('&', $sets);  
                }  
                curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);  
            }  
            else 
                if ('put' == $method)  
                {  
                    curl_setopt($ch, CURLOPT_PUT, true);  
                }  
     
            //curl_setopt($ch, CURLOPT_PROGRESS, true);  
            //curl_setopt($ch, CURLOPT_VERBOSE, true);  
            //curl_setopt($ch, CURLOPT_MUTE, false);  
            curl_setopt($ch, CURLOPT_TIMEOUT, 600);  
     
            if (strlen($userAgent))  
            {  
                curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);  
            }  
     
            if (is_array($httpHeaders))  
            {  
                curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeaders);  
            }  
     
            $ret = curl_exec($ch);  
     
            if (curl_errno($ch))  
            {  
                curl_close($ch);  
                return array(curl_error($ch), curl_errno($ch));  
            }  
            else 
            {  
                curl_close($ch);  
                if (!is_string($ret) || !strlen($ret))  
                {  
                    return false;  
                }  
                return $ret;  
            }  
        }  
     
        function post($url, $fields, $userAgent = '', $httpHeaders = '', $username = '',  
            $password = '')  
        {  
            $ret = Curl_Class::execute('POST', $url, $fields, $userAgent, $httpHeaders, $username,  
                $password);  
            if (false === $ret)  
            {  
                return false;  
            }  
     
            if (is_array($ret))  
            {  
                return false;  
            }  
            return $ret;  
        }  
     
        function get($url, $userAgent = '', $httpHeaders = '', $username = '', $password =  
            '')  
        {  
            $ret = Curl_Class::execute('GET', $url, '', $userAgent, $httpHeaders, $username,  
                $password);  
            if (false === $ret)  
            {  
                return false;  
            }  
     
            if (is_array($ret))  
            {  
                return false;  
            }  
            return $ret;  
        }  
     
        function create()  
        {  
            $ch = null;  
            if (!function_exists('curl_init'))  
            {  
                return false;  
            }  
            $ch = curl_init();  
            if (!is_resource($ch))  
            {  
                return false;  
            }  
            return $ch;  
        }  
     
    }  
    ?> 

  4、主动监控守护进程
  脚本:/data0/monitor/monitor.sh

    #!/bin/sh  
    while true  
    do  
       /bin/sh /data0/monitor/http.sh > /dev/null 2>&1  
       /bin/sh /data0/monitor/tcp.sh > /dev/null 2>&1  
       /usr/local/php/bin/php /data0/monitor/mysql.php > /dev/null 2>&1  
       sleep 10  
    done 

  启动主动监控守护进程:
/usr/bin/nohup /bin/sh /data0/monitor/monitor.sh 2>&1 > /dev/null &

三、被动报告监控(“被监控机”采集数据发送给“监控机”)
  1、磁盘空间使用量监控
  2、磁盘Inode使用量监控
  3、Swap交换空间使用量监控
  4、系统负载监控
  5、Apache进程数监控

Linux服务器监控

我管理服务器太多了,不可能每时每刻都登录到上面查看服务器状况,于是写了一个“服务器监控系统 ServMon V1.0”。其原理是用shell脚本定时抓取被监控服务器上信息,再用curl POST到监控机的PHP接口程序上,由PHP接口程序对信息进行分析,如果存在异常,则发送报警邮件给管理员。
  下午,ServMon V1.0 已经在sina播客服务器上部署,以下为ServMon的删节版内容,只监控磁盘分区使用率和Swap交换空间两项:
   继续阅读