它山之石,可以攻玉。监控子系统是每一个高级应用软件平台必不可少的一个子系统,这个子系统应具备的基本功能包括:各进程的运行状态,系统资源的占用状况,重要配置文件的改变情况,重要目录的异动,常用服务的对外提供情况等。一种可行的实现方法是自己写一大堆的脚本,然后加入crond服务去定时做这些监控, 另一条捷径是利用开源软件Monit。本文介绍如何利用Monit去快速构建一个具备上述功能的软件平台的监控子系统。
全局设置:
Monit可以从网上下载源码自己编译安装,也可以直接找现成的二进制rpm包安装。成功安装后会自动生成全局配置文件/etc/monit.conf,一个示列如下:
[root@RHEL5 1.0.1]# less monit.conf
set daemon 10
set logfile syslog facility log_local2
set mailserver mail.foo.bar
set alert [email protected]
set httpd port 9527
allow 0.0.0.0/0
allow adm:bbnd_adm
include /adm/config/monit/logging.rc
include /adm/config/monit/mysql_log.rc
include /adm/config/monit/process.rc
include /adm/config/monit/core.rc
该示例简单说明如下:
1.设定Monit监控间隔时间为10s;
2.设定monit日志输出facility, 参见syslog;
3.设定邮件通知服务器地址,默认server地址为localhost;
4.设定告警通知邮件的目的地;
5.monit内置一个Web服务器,用于展示系统当前运行状态,这里设定访问port.比如在浏览器里输入:http://192.168.1.2:9527.注意别被iptables阻隔了;
6.设为充许任何机器访问监控结果;
7.设定访问的监控结果的用户名跟密码;
8.跟C语言的include语义一样,把那些文件的内容包含进本文件.
监控进程:
进程监控可以监控进程是否退出,异常退出频率,CPU使用情况,内存使用情况,子进程的数目等.一个示例如下:
check process smb with pidfile /var/run/smbd.pid
start program = "/etc/init.d/smb start"
stop program = "/etc/init.d/smb stop"
if 2 restarts within 3 cycles then timeout
if totalmem > 100 Mb then alert
if children > 255 for 5 cycles then stop
if cpu usage > 95% for 3 cycles then restart
depends on smb.conf
check file smb.conf with path /etc/samba/smb.conf
if changed checksum then exec "/etc/init.d/smb restart"
该配置的用意如下:
1.当smb退出的时候,自动重启smb;
2.当在连续3次检查过程中有两次以上出问题,认为smb服务本身已经出错。则不再浪费时间去重启smb;
3.如果总的内存使用量超过100M则发送告警通知邮件;
4.如果在连续5次检查过程中子进程数都超过255个则停smb服务.这里纯粹是一个说明示例,对smb来说检查子进程没有意义;
5.如果在连续3次检查CPU使用率超过95%则重启smb服务.通过选stop然后start实现
6.指定smb监控还依依赖于smb.conf文件
7.如果smb.conf文件内容有变则重启smb服务。
如上,monit内置了已经很多的检查及动作,但由于提供了exec这种响应方式,所以你也可以扩展,比如可以写一个脚本发送一个信号到目标程序,并以约定好的方式通知目标程序当前发生了什么事情。这样目标程序就很容易的可以做出相应的响应。
监控文件:
文件监控可以监控文件的大小,检查文件是否做过修改等。一个简单的示例如下:
check file AdmApp.log with path /adm/log/AdmApp.log
if size > 100 MB then exec "/usr/sbin/logrotate -f /adm/config/app_log_rotate.conf"
该配置用意如下:
1.当日志文件AdmApp.log的大小大于100M时就使用logrorate进行日志转储,以避免产生过多的日志以及过大的日志文件。
监控目录:
目录监控用于监控目录的变动情况。一个简单的示例如下:
[root@RHEL5 1.0.1]# less core.rc
check directory bin with path /adm/bin
if changed timestamp then exec "/bin/corerotate /adm/ 6"
[root@RHEL5 1.0.1]# less /bin/corerotate
Num=$2
eval "ls --sort=time $1/core.*" | gawk 'NR > "'"$Num"'" {system("/bin/rm -rf " $0)}'
这个例子用意如下:
1.如下目录/adm/bin发生了变动就执行脚本/adm/bin/corerotate /adm/bin 6. 这个脚本用于保留最新生成的6个core文件,以防止大量的老旧core文件占用存储空间。
监控设备:
设备监控用于监控设备的使用情况,比如一块硬盘的使用空间情况,里面创建I节点数的情况等。一个简单的示例如下:
check device disk1 with path /dev/hda1
start = "/bin/mount /dev/hda1 /mnt/test"
stop = "/bin/umont /mnt/test"
if space usage > 90% then alert
if space usage > 99% then stop
这个例子用意如下:
1.如果/dev/hda1空闲,则自动挂载/dev/hda1
2.如果这个硬盘分区使用量超过90%时发送告警邮件
3.如果使用量超过99%时umount该设备
监控远程主机:
远程主机服务监控可以监控运程主动服务的提供情况,来通知本地进程做出相应的响应。一个简单的示例如下:
check host up2date with address 192.168.1.2
if failed port 21 protocol ftp
then exec “/usr/bin/genalarm /“NO FTP Service/” TestPrograme”
[root@RHEL5 1.0.1]# less genalarm
#!/bin/bash
# Author: Joshua Guo
# Time: July 23 2010
# Usage: genalarm [signal no] [process name]
if (( $# != 2 ))
then
echo "Usage: genalarm [alarm] [process name]"
exit 1
fi
pidfile="/var/run/$2.pid"
pid=
if [ -f "$pidfile" ]
then
line=
p=
read line < "$pidfile"
for p in $line
do
[ -z "${p//[0-9]/}" -a -d "/proc/$p" ] && pid="$pid $p"
done
if [ -n "$pid" ]
then
echo "$1" > /var/run/notice;
kill -SIGUSR2 $pid &> /dev/null
fi
else
echo "something wrong"
fi
这个例子用意如下:
1.如果远端机器192.168.1.2的ftp服务中断,则通知应用程序TestPrograme远端ftp服务已经中断。
从上可见,只需要简单的配置monit加上一些用C或是shell编写的胶合程序。一个强大的平台监控子系统就建立起来了。上面只是例举了一些简单的例子,更多详细信息请man monit和该问网站http://mmonit.com/monit/