[文章作者:张宴 本文版本:v1.0 最后修改:2007.08.03 转载请注明出处:http://blog.zyan.cc]

  我管理服务器太多了,不可能每时每刻都登录到上面查看服务器状况,于是写了一个“服务器监控系统 ServMon V1.0”。其原理是用shell脚本定时抓取被监控服务器上信息,再用curl POST到监控机的PHP接口程序上,由PHP接口程序对信息进行分析,如果存在异常,则发送报警邮件给管理员。

  下午,ServMon V1.0 已经在sina播客服务器上部署,以下为ServMon的删节版内容,只监控磁盘分区使用率和Swap交换空间两项:

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

  1、被监控端服务器的shell脚本(Linux)
  (1)、发送磁盘分区使用率给监控端接口http://192.168.0.28/servmon/interface.php的脚本
引用
/usr/local/servmon/bin/diskstat_send
#!/bin/sh
LANG=zh_cn
disk=$(/bin/df -kP | grep / | awk -F ' ' ' {print $6":"$5}' | awk -F '%' ' {print $1}' | tr -s '\n' ';')
today=$(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 '\n' ';')
/usr/bin/curl -d menu=diskstat -d password=$2 -d date=$today -d ip=$ip -d data=$disk $1

  磁盘分区使用率监控报警邮件示例图:
  点击在新窗口中浏览此图片


  (2)、发送Swap交换空间使用率给监控端接口http://192.168.0.28/servmon/interface.php的脚本
  /usr/local/servmon/bin/swapstat_send
引用
#!/bin/sh
LANG=zh_cn
data=$(/usr/bin/free -m | grep Swap | awk '{print $2":"$3":"$4}')
today=$(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 '\n' ';')
/usr/bin/curl -d menu=swapstat -d password=$2 -d date=$today -d ip=$ip -d data=$data $1

  Swap交换空间使用率监控报警邮件示例图:
  点击在新窗口中浏览此图片

  (3)、计划任务:每30分钟将磁盘分区使用率发送给监控端接口,每10分钟将Swap交换空间使用率发送给监控端接口。
  /etc/cron.d/servmon
引用
0-30/30 * * * * root /bin/sh /usr/local/servmon/bin/diskstat_send http://192.168.0.28/servmon/interface.php yourpassword
0-50/10 * * * * root /bin/sh /usr/local/servmon/bin/swapstat_send http://192.168.0.28/servmon/interface.php yourpassword





  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接口程序用来记录发送磁盘分区报警邮件的时间,避免在一段时间内重复发送大量报警邮件的,其实完全可以用Session、文本文件来代替它。这里之所以用MySQL数据库,是因为PHP接口中还将增加一些需要记录信息到数据库的监控模块,所以就统一用数据库了。)

  (3)、PHP接口程序
  http://192.168.0.28/servmon/interface.php


Tags: ,



技术大类 » 其他Unix技术 | 评论(48) | 引用(0) | 阅读(51094)
无香
2007-8-4 17:19
救命啊 qq被盗了怎么办啊
   哭救救我啊
张宴 回复于 2007-8-4 19:39
王彤
2007-8-5 17:22
没太看懂你写的   那157段 是什么编的?
张宴 回复于 2007-8-5 18:35
PHP
LALA
2007-8-25 15:38
还有没有在Linux下监控服务器的CPU ,内存和 MySQL数据库的使用情况呢?能否再发贴补上呀?关注+ING......
张宴 回复于 2007-8-28 13:29
top -n1命令中有CPU使用率信息,free命令可以查看内存使用率,写一个shell脚本,使用awk或sed将其中的信息取出来即可,很简单。有空我会补上。
zhangluoer
2007-8-28 13:18
在正常使用的服务器上打开sendmail岂不是又为系统暴露了一个漏洞,再说sendmail的漏洞是出了名的。如果在内网使用的话,邮件怎么传送到你的邮箱里呢?这与只打开必须的服务,最少的服务有点不符啊!
每个服务器上都要打开sendmail不成?
别外,监控MYSQL数据库,主要的方法是什么?通过什么样的监控手段来证明服务器是正常运行的?讲讲原理呗!
张宴 回复于 2007-8-28 14:09
不需要在每台服务器上打开sendmail,每台服务器上的信息通过curl -d将信息传输给一台监控服务器,由这台监控服务器上的SendMail发送邮件。
SendMail默认只监听本机的127.0.0.1:25端口,即使SendMail有漏洞,外网连不上你的端口,也无法攻击你。
/etc/mail/sendmail.cf
O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA
LALA
2007-8-28 15:43
再请问:在Linux下能不能监控服务器的 MySQL数据库的使用情况呢?它的脚本如何写?
谢谢。。。
sbear Homepage
2007-9-3 12:44
为什么不用snmp么?比cacti有什么优势?
张宴 回复于 2007-9-3 14:42
snmp+cacti监控我们也有,只是本文的落脚点不同,snmp+cacti可以画出系统负载、内存使用、流量等趋势图,比较直观,这些数据主要是提供给我们查看、分析。

   而本文的监控着重于服务器灾难预警,如果磁盘分区空间满,可能会导致数据丢失;如果Swap交换空间满,会导致内存溢出而死机;如果系统负载过高,会导致系统无法响应用户请求。在这些灾难即将发生之前,通过本文的监控程序发送邮件告知管理员,让其及时处理,这就是本文所写监控程序的目的。
coolzsb Email Homepage
2007-9-4 15:15
snmp+cacti还可以再加一个cacti的thold插件
sbear Homepage
2007-9-4 17:05
楼上正解,还有monitor插件
WW
2007-9-7 11:53
为什么总是提示数据验证密码错误!!
qintel
2007-9-19 23:02
用shell的expect+telnet直接就可以发邮件了,不必再发到php接口程序上。
http://docs.google.com/View?docID=dhjp43kc_15hjhs5m
三源电子
2007-12-30 21:42
好厉害。学习了!
Julyclyde
2008-1-31 22:05
年轻人,用LANG=zh_CN的时候别忘记指定具体编码方式,是GB2312还是UTF-8呢?我发现新浪的人总是在这个问题上不够明确

另外,系统脚本最好在LANG=C的情况下运行
zyu
2008-3-25 16:04
lovethetree
2008-9-2 21:33
都是好思路,学习了 家门儿
lovethetree
2008-9-2 21:34
迟了一年cry
lwh
2008-11-24 13:39
nagios 也不错zanzanzan
听雨
2009-1-16 11:34
汗。。。。
请教关于程序中shell的问题
sr/cbin/diskstat_send  文件中
disk=$(/bin/df -kP | grep / | awk -F ' ' ' {print $6":"$5}' | awk -F '%' ' {print $1}' | tr -s 'n' ';')
这行命令中的
awk -F ' ' ' {print $6":"$5}'  我实在想不通 ' ' ' 怎么能把
/dev/sda1               101086     11731     84136      13% /boot
各个字段取出来
susu
2009-5-26 15:04
不错  LZ牛人
platonaffection
2009-9-5 12:56
LZ牛人啊,专业是国际贸易,学的是LINUX,跟你一样,是学经经济的,现在在玩网络,准备学习LINUX.
tankinc
2009-12-5 17:25
P122-P131是不是不需要阿?
分页: 1/3 第一页 1 2 3 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]