首页 > Linux > 写完“Linux服务器监控系统 ServMon V1.1”

写完“Linux服务器监控系统 ServMon V1.1”

2008年7月8日 Galaxy 发表评论 阅读评论

http://blog.s135.com/read.php/291.htm

写完“Linux服务器监控系统 ServMon V1.1”[原创]

| |
[不指定 2007-8-31 18:23 | by 张宴 ]
[文章作者:张宴 本文版本: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

  1. <?php
  2. /**
  3. *********************************************************************
  4. * Copyright (c) 2007, 回忆未来[张宴]
  5. * All rights reserved.
  6. *
  7. * 文件名称: interface.php
  8. * 摘    要: 服务器监控系统ServMon接口程序
  9. * 描    述:
  10. * 作    者: 张宴  新浪UC:103500  博客:blog.s135.com
  11. * 版    本: 1.1
  12. * 时    间: 2007-08-31
  13. *********************************************************************
  14. */
  15. //——————配置信息——————
  16. $password = “yourpassword”;//设置数据传输验证密码,ServMon客户端安装时需要指定此密码
  17. $mysql_server = “127.0.0.1:3306″;//MySQL服务器地址及端口,例如localhost:3306
  18. $mysql_db = “servmon”;//MySQL数据库名
  19. $mysql_username = “root”;//MySQL帐号
  20. $mysql_password = “”;//MySQL密码
  21. $disk_max = “90″;//磁盘分区使用百分比超过此值,则报警。默认为90%
  22. $disk_sendmail_interval = “43200″;//如果同一台服务器连续报警,设置每隔多少秒发送一次报警邮件。默认为43200秒,即12小时。
  23. $swap_max = “50″;//Swap交换空间使用百分比超过此值,则报警。默认为50%
  24. $email = “webmaster@s135.com,info@s135.com”;//管理员邮箱,多个邮箱以逗号分割
  25. //——————————————–
  26. //密码验证
  27. if (htmlspecialchars($_POST["password"]) != $password)
  28. {
  29. echo “数据传输验证密码错误!\n”;
  30. exit();
  31. }
  32. //磁盘分区报警(分区使用率超过90%后会发邮件报警)
  33. if (htmlspecialchars($_POST["menu"]) == “diskstat”)
  34. {
  35. $is_send_mail = “0″;//是否发邮件,0为不发邮件
  36. $date = htmlspecialchars($_POST["date"]);
  37. $ip = htmlspecialchars($_POST["ip"]);
  38. $data = htmlspecialchars($_POST["data"]);
  39. $arr1 = explode(“;”, $data);
  40. foreach ($arr1 as $key1 => $value1)
  41. {
  42. $arr2 = explode(“:”, $value1);
  43. if ($arr2[0] != “” && $arr2[1] != “” && $arr2[1] >= $disk_max)
  44. {
  45. $subject = “[系统监控]_磁盘分区空间不足_” . $ip;
  46. $message = “服务器监控系统 ServMon V1.1\r\n”;
  47. $message = $message . “——————————————————-\r\n”;
  48. $message = $message . “报警服务器:” . $ip . “\r\n”;
  49. $message = $message . “——————————————————-\r\n”;
  50. $message = $message . “报警时间:” . $date . “\r\n”;
  51. $message = $message . “——————————————————-\r\n”;
  52. $message = $message . “报警内容:\r\n”;
  53. $message = $message . “●磁盘分区 ” . $arr2[0] . “ 空间不足(空间使用率达到” . $arr2[1] . “%)\r\n”;
  54. $headers = ‘From: ServMon <servmon@sina.com>’ . “\r\n” .
  55. ‘Reply-To: ServMon <servmon@sina.com>’ . “\r\n” . ‘X-Mailer: PHP/’ . phpversion();
  56. $is_send_mail = “1″;//是否发邮件,1为发送邮件
  57. }
  58. }
  59. if ($is_send_mail == “1″)
  60. {
  61. $connect = mysql_connect($mysql_server, $mysql_username, $mysql_password);
  62. $select = mysql_select_db($mysql_db, $connect);
  63. $select_result = mysql_query(“SELECT date FROM tb_diskstat WHERE ip=’” . $ip .
  64. “‘ LIMIT 1″);
  65. $rs = mysql_fetch_array($select_result);
  66. $interval = date(“U”) - $rs["date"];
  67. if ($interval >= $disk_sendmail_interval)
  68. {
  69. if (mail($email, $subject, $message, $headers))
  70. {
  71. echo “已成功发送报警邮件!\n”;
  72. }
  73. else
  74. {
  75. echo “发送报警邮件失败!\n”;
  76. }
  77. $insert_result = mysql_query(“REPLACE INTO tb_diskstat (ip, date) VALUES (‘” . $ip .
  78. “‘, ’” . date(“U”) . “‘);”);
  79. }
  80. else
  81. {
  82. if ($disk_sendmail_interval >= 3600)
  83. {
  84. $disk_sendmail_interval_text = $disk_sendmail_interval / 3600 . “小时”;
  85. }
  86. else
  87. {
  88. $disk_sendmail_interval_text = $disk_sendmail_interval . “秒”;
  89. }
  90. echo “已发送过报警邮件,” . $disk_sendmail_interval_text . “内不再重复发送!\n”;
  91. }
  92. }
  93. else
  94. {
  95. echo “磁盘分区空间足够,无须发送报警邮件!\n”;
  96. }
  97. exit();
  98. }
  99. //Swap交换空间报警(Swap交换空间使用率超过60%后会发邮件报警)
  100. if (htmlspecialchars($_POST["menu"]) == “swapstat”)
  101. {
  102. $is_send_mail = “0″;//是否发邮件,0为不发邮件
  103. $date = htmlspecialchars($_POST["date"]);
  104. $ip = htmlspecialchars($_POST["ip"]);
  105. list($total, $used, $free) = split(“:”, htmlspecialchars($_POST["data"]));
  106. $percentage = round($used / $total * 100, 0);
  107. if ($percentage >= $swap_max)
  108. {
  109. $subject = “[系统监控]_Swap交换空间使用率高达” . $percentage . “%_” . $ip;
  110. $message = “服务器监控系统 ServMon V1.1\r\n”;
  111. $message = $message . “——————————————————-\r\n”;
  112. $message = $message . “报警服务器:” . $ip . “\r\n”;
  113. $message = $message . “——————————————————-\r\n”;
  114. $message = $message . “报警时间:” . $date . “\r\n”;
  115. $message = $message . “——————————————————-\r\n”;
  116. $message = $message . “报警内容:\r\n”;
  117. $message = $message . “●Swap交换空间使用率高达” . $percentage . “%,若继续增加到100%可能会导致服务器死机。\r\n”;
  118. $message = $message . “●Swap交换空间总量:” . $total . “ MB\r\n”;
  119. $message = $message . “●Swap交换空间使用:” . $used . “ MB\r\n”;
  120. $message = $message . “●Swap交换空间剩余:” . $free . “ MB\r\n”;
  121. $headers = ‘From: ServMon <servmon@sina.com>’ . “\r\n” .
  122. ‘Reply-To: ServMon <servmon@sina.com>’ . “\r\n” . ‘X-Mailer: PHP/’ . phpversion();
  123. $is_send_mail = “1″;//是否发邮件,1为发送邮件
  124. }
  125. if ($is_send_mail == “1″)
  126. {
  127. if (mail($email, $subject, $message, $headers))
  128. {
  129. echo “已成功发送报警邮件!\n”;
  130. }
  131. else
  132. {
  133. echo “发送报警邮件失败!\n”;
  134. }
  135. }
  136. else
  137. {
  138. echo “Swap交换空间使用率不高,无须发送报警邮件!\n”;
  139. }
  140. exit();
  141. }
  142. //系统负载过高报警
  143. if (htmlspecialchars($_POST["menu"]) == “loadstat”)
  144. {
  145. $is_send_mail = “0″;//是否发邮件,0为不发邮件
  146. $date = htmlspecialchars($_POST["date"]);
  147. $ip = htmlspecialchars($_POST["ip"]);
  148. list($load_last_1min, $load_last_5min, $load_last_15min) = split(“,”,
  149. htmlspecialchars($_POST["data"]));
  150. if ($load_last_15min >= 25)
  151. {
  152. if ($load_last_15min < 50)
  153. {
  154. $level = “轻微”;
  155. }
  156. elseif ($load_last_15min < 100)
  157. {
  158. $level = “严重”;
  159. }
  160. elseif ($load_last_15min < 500)
  161. {
  162. $level = “非常严重”;
  163. }
  164. else
  165. {
  166. $level = “接近崩溃”;
  167. }
  168. $subject = “[系统监控]_系统负载过高(“ . $level . “)_” . $ip;
  169. $message = “服务器监控系统 ServMon V1.1\r\n”;
  170. $message = $message . “——————————————————-\r\n”;
  171. $message = $message . “报警服务器:” . $ip . “\r\n”;
  172. $message = $message . “——————————————————-\r\n”;
  173. $message = $message . “报警时间:” . $date . “\r\n”;
  174. $message = $message . “——————————————————-\r\n”;
  175. $message = $message . “报警内容:\r\n”;
  176. $message = $message . “●系统负载过高,级别:” . $level . “ (25~50轻微、50~100严重、100~500非常严重、>500接近崩溃)\r\n”;
  177. $message = $message . “●最近 1分钟系统负载:” . $load_last_1min . “\r\n”;
  178. $message = $message . “●最近 5分钟系统负载:” . $load_last_5min . “\r\n”;
  179. $message = $message . “●最近15分钟系统负载:” . $load_last_15min . “\r\n”;
  180. $headers = ‘From: ServMon <servmon@sina.com>’ . “\r\n” .
  181. ‘Reply-To: ServMon <servmon@sina.com>’ . “\r\n” . ‘X-Mailer: PHP/’ . phpversion();
  182. $is_send_mail = “1″;//是否发邮件,1为发送邮件
  183. }
  184. if ($is_send_mail == “1″)
  185. {
  186. if (mail($email, $subject, $message, $headers))
  187. {
  188. echo “已成功发送报警邮件!\n”;
  189. }
  190. else
  191. {
  192. echo “发送报警邮件失败!\n”;
  193. }
  194. }
  195. else
  196. {
  197. echo “系统负载不高,无须发送报警邮件!\n”;
  198. }
  199. exit();
  200. }
  201. ?>

Tags: ,

Related posts

分类: Linux 标签: , 154 views
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

Locations of visitors to this page