摘要:文章提出了一種實用的校園網監控系統設計思想,該思想利用PHP、腳本編程和curl命令實現對校園網各種設備的監控,依據該思想設計開發了一套校園網監控系統,運行結果表明該系統能夠起到監控校園網運行的作用。
關鍵詞:cron curl 腳本 校園網監控系統
中圖分類號:TP391 文獻標識碼:A 文章編號:1673-8454(2009)07-0027-03
目前校園網規模越來越大,核心設備、各種服務器越來越多,校園網建設已逐步從規模建設階段轉入內涵建設階段,即數字化校園建設階段,而數字化校園建設階段的首要前提是保障校園網的正常、高效運行,而保障校園網正常、高效運行的基礎是能夠隨時隨地了解和監控校園網核心設備、各種服務器的運行狀態。[1]
一、校園網監控系統設計思路
校園網中主要設備一般分為兩大類,一類設備是用戶只能用其提供的命令對其進行操作,不能在其操作系統上用腳本或語言編程控制,在此筆者稱其為“不可編程設備”,如各種可網管交換機、防火墻和路由器等;另一類設備用戶可以用腳本或語言對其編程控制,筆者稱其為“可編程設備”,如各種服務器。校園網監控系統設計原理如圖1所示,監控服務器通過監控程序定時登錄到各種“不可編程設備”上,調用設備本身提供的命令,取得設備的各種運行狀態變量,并將結果存儲到監控服務器的數據庫中。對于“可編程設備”,則由其自身周期性的運行腳本取得自身的各個狀態參數,然后通過調用監控服務器上的監控程序將結果存儲到監控服務器的數據庫中,然后由設備狀態顯示程序將各設備的狀態參量以某種方式顯示出來,供校園網管理人員即時地了解校園網各設備的運行狀態,進而達到監控整個校園網主要設備,保證校園網正常運行的目的。

圖1校園網監控系統原理圖
二、校園網監控系統組成
如圖2所示,校園網監控系統共包括三個模塊,其作用分別如下:

圖2校園網監控系統組成
(1)“不可編程設備”采集模塊的主要作用是采集校園網中各個“不可編程設備”狀態數據,如CPU利用率、設備反應時間、特定端口利用率等。該模塊又含三個子模塊,分別是定時模塊、數據采集模塊和存儲模塊,定時模塊(運行于監控服務器上)周期性地調用數據采集模塊采集數據,然后由存儲模塊將數據存儲到監控服務器的數據庫中。
(2)“可編程設備”數據采集模塊的主要作用是采集校園網中各個“可編程設備”的狀態數據,如磁盤分區空間利用率、Swap交換空間使用率、系統負載情況等。該模塊也分定時模塊、數據采集模塊和存儲模塊,“可編程設備”執行腳本程序取得系統自身相關狀態參數后,由定時模塊(運行于“可編程設備”上)周期性地調用數據采集模塊采集數據,然后由存儲模塊將數據存儲到監控服務器的數據庫中。
(3)設備狀態數據顯示模塊的主要作用是周期性地將數據庫中的數據通過IE瀏覽器顯示出來,供校園網管理人員即時了解和掌握校園網各主要設備的運行狀態。
三、校園網監控系統實現
1.系統運行環境
監控系統服務器采用Pentium 4以上處理器即可,具有光驅、100M網卡,以備安裝系統和接入校園網。本系統運行平臺為RedHat Linux9.0,也可為AS系列,要求系統整合安裝MySQL、Apache、PHP和Zend環境,安裝Cron定時功能。
2.數據庫結構
本系統需要建立數據表device_wrong,用于存儲設備的狀態數據,表的數據字典如表1所示。

3.具體實現
(1)“不可編程設備”數據采集模塊
由系統組成可知,該模塊由定時模塊、數據采集模塊和存儲模塊3個子模塊組成。其中,定時模塊運行于監控服務器上,由cron定時功能周期性地調用數據采集模塊和存儲模塊,定時模塊實現如下:[2]
10,20,30,40,50 * * * * /usr/bin/curl "http://監控服務器ip/path/non_program.php"
其中,curl是一個利用URL語法在命令行方式下工作的文件傳輸工具,功能是在命令提示符下執行雙引號內的程序。[3]
數據采集模塊、存儲模塊由non_program.php實現,其中,實現監控服務器登錄到“不可編程設備”的協議程序核心代碼如下:[1]
<?class telnet {
var $sock=NULL;
function telnet($host,$port)
{ $this->sock = fsockopen($host,$port,$errno, $errstr, 10);
if( !$this->sock ) exit("無法連接遠程主機:".$host.",請稍后再試!");
socket_set_timeout($this->sock,2,0);
}
function close()
{ if ($this->sock) fclose($this->sock); $this->sock = NULL;
}
function write($buffer)
{fwrite($this->sock,$buffer); }
function getc()
{return fgetc($this->sock); }
function input_rate()
{ $buf = ′′; $what="bits/sec";
while (1)
{$IAC = chr(255); $theNULL = chr(0);
$c = $this->getc();if ($c === false) return $buf;
if ($c == $theNULL) continue; $buf .= $c;
if ($what == (substr($buf,strlen($buf)-strlen($what))))
return substr(strstr($buf,"input rate"),10);
else continue;
}}}?>
(2)“可編程設備”數據采集模塊
由系統組成可知,該模塊也含定時、數據采集和存儲三個子模塊,其中定時模塊由各服務器上的定時功能實現,同時需要編寫腳本代碼,以便將服務器的各個狀態變量傳遞給監控服務器上的監控程序,本文中主要監控各服務器的磁盤分區空間利用率、swap交換空間使用率、系統負載情況三項指標,腳本實現如下:
1)磁盤分區空間利用率腳本,名稱為disk
#!/bin/sh
LANG=zh_cn
var=$(/bin/df -kP | grep / | awk -F ′′′ {print $6":"$5}′ | awk -F ′%′ ′ {print $1}′ | tr -s ′ ′ ′;′)
date=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")
ip=$(/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk ′{print $2;}′ | awk -F′:′ ′{print $2;}′ | tr -s ′ ′ ′;′)
/usr/bin/curl -d menu=disk -d date=$date -d ip=$ip -d data=$var "http://監控服務器/path/program.php"
2)swap交換空間使用率和系統負載腳本名稱分別為swap和load,它們和磁盤分區空間利用率腳本只是var和menu變量不同,其余均相同,分別如下:
swap腳本:var=$(/usr/bin/free -m | grep Swap | awk ′{print $2":"$3":"$4}′);menu=swap
load腳本:var=$(/usr/bin/uptime | awk -F′load average: ′ ′{print $2}′ | awk ′{print $1$2$3}′);menu=load
3)定時腳本,名稱為server
10,20,30,40,50 * * * * /usr/bin/disk
15,30,45 * * * * /usr/bin/swap
16,31,46 * * * * /usr/bin/load
4)數據采集模塊和存儲模塊實現核心代碼如下:[4]
<? $disk_max = "90";//磁盤分區使用百分比超過此值,則報警。默認為90%
$swap_max = "50";//Swap交換空間使用百分比超過此值,則報警。默認為50%
if (htmlspecialchars($_POST["menu"]) == "disk")
{$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 = $message . "報警服務器:" . $ip . " ";
$message = $message . "報警時間:" . $date . " ";
$message = $message . "報警內容: ";
$message = $message . "磁盤分區 " . $arr2[0] . " 空間不足(空間使用率達到" . $arr2[1] . "%) ";
}}
require("./save.php");//將數據內容存儲到數據庫中}
if (htmlspecialchars($_POST["menu"]) == "swap")
{$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 = $message . "報警服務器:" . $ip . " ";
$message = $message . "報警時間:" . $date . " ";
$message = $message . "報警內容: ";
$message = $message . "Swap交換空間使用率高達" . $percentage . "%。 ";}
require("./save.php");//將數據內容存儲到數據庫中}
if (htmlspecialchars($_POST["menu"]) == "load")
{$date = htmlspecialchars($_POST["date"]);
$ip = htmlspecialchars($_POST["ip"]);
list($load_last_1min, $load_last_5min, $load_last_15min) = split(",", htmlspecialchars($_POST["data"]));
$subject = "系統負載過高" . $ip;
$message = $message . "報警服務器:" . $ip . " ";
$message = $message . "報警時間:" . $date . " ";
$message = $message . "報警內容: ";
$message = $message . "最近 1分鐘系統負載:" . $load_last_1min . " ";
$message = $message . "最近 5分鐘系統負載:" . $load_last_5min . " ";
$message = $message . "最近15分鐘系統負載:" . $load_last_15min . " ";}
require("./save.php");//將數據內容存儲到數據庫中}?>
(3)設備狀態數據顯示模塊
該模塊的主要作用是將存儲在數據庫中的設備狀態數據顯示出來,本系統中采用了圖形化的顯示方法,直觀明了,程序執行時界面如圖3所示,當設備運行正常時,圖片顯示正常,否則顯示一個紅色“╳”號的圖片,當鼠標移動到圖片上時動態顯示出設備的故障情況。
<img src="http://img1.qikan.com.cn/qkimages/educ/educ200904/educ20090410-4-l.jpg" hspace="15" vspace="5" align="">
圖3校園網監控系統運行界面
四、結束語
本監控系統自去年運行以來,對校園網的正常運行起到了較好的監控作用,真正扭轉了校園網管理的被動局面,對各種校園網故障起到了很好的預防作用。
參考文獻:
[1]錢愛增.基于Web的簡易實用校園網管理系統的設計思路及實現[J].重慶工學院學報(自然科學版),2007,21(11),155-159.
[2]cron的使用.http://www.hackhome.com/InfoView/Article_ 79273.html,2007-6-2.
[3]CURL命令行下載工具.http://blog.csdn.net/dbigbear/archive/2006/11/21/1402580.aspx,2006-11-21.
[4]張宴.linux服務器監控系統ServMon V1.1.http://blog.s135.com/read.php/291.htm,2007-08-31.