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