此监控脚本适用于centos5.8,在其他系统下不能保证监控脚本全部有效,可以将监控脚本里面的命令逐一测试。
配置邮件服务
想通过linux监控网站或者系统状况并自动报警,如何使用脚本发出邮件给外部邮箱呢?
CentOS5自带的mailx是8.1版本的,不支持配置外部公网邮箱,可升级到最新版本12.4。
查看centos5.8自带的版本
rpm -qa | grep mailx
官方yum没有12.4的版本,可以编译安装
cd /usr/local wget http://sourceforge.net/projects/heirloom/files/latest/download?source=files tar jxvf mailx-12.4.tar.bz2 cd mailx-12.4 make make install UCBINSTALL=/usr/bin/install
如此即安装完毕。这时,如果没有卸载旧版本的mailx,是不能直接使用mailx或mail命令的,否则使用的仍然是旧版mailx。调用路径为:解压路径/mailx-12.4/mailx。例如我解压在/usr/local下,那我要使用新版mailx并查看版本号,则可以用/usr/local/mailx-12.4/mailx -V 查看。
为使得新版mailx更加易用,我们可以利用alias和.bashrc将mail命令指向该新版mailx:
vim /root/.bashrc
添加一行:
alias mail='/usr/local/mailx-12.4/mailx'
即时生效:
source /root/.bashrc
接下来配置新版mailx使用外部邮箱发送邮件:
编辑/etc/nail.rc(注意不是旧版的/etc/mail.rc):vi /etc/nail.rc
添加两行:
set from=lijc@wiselong.com smtp=smtp.exmail.qq.com set smtp-auth-user=lijc@wiselong.com smtp-auth-password=password smtp-auth=login
第一行指明所使用的外部邮箱及smtp服务器,第二行指明外部邮箱使用的用户名和密码。
到此可以在命令行直接发邮件到外部邮箱了:
echo hello! | mailx -s test lijc@wiselong.com
到外部邮箱一看,邮件即刻收到了。
当然我们也可以将一个文件的内容作为邮件的正文发出去
mailx -s test lijc@wiselong.com < /usr/local/test.txt
如果要让脚本发邮件,脚本里面的命令需要调用安装目录下的mailx,不然发不出去。
/usr/local/mailx-12.4/mailx -s警告 lijc@wiselong.com < /usr/local/test.txt
设置监控脚本
Vim sysmon.sh #网络延迟监控 #>每次结果都会更新 ping -c 5 www.baidu.com > /tmp/ping.txt #每次结果追加到log.txt,记录网络延迟。 ping -c 5 www.baidu.com >> /tmp/log.txt #看/tmp/log.txt文件大小,以M为单位 sizi=`du -sm /tmp/log.txt | awk '{print $1}'` #查看ping百度5次最小ping值 ping=`cat /tmp/ping | grep "rtt" |awk '{print $4}' | awk -F. '{print $1}'` #比较最小ping值是否大于50 if [ $ping -gt 50 ] then echo "警告:网络延迟超过50ms!" >> /tmp/alert.txt fi #较log.txt文件,大于1014M,发送报警 if [ $sizi -gt 1024 ] then echo "警告:/tmp/log.txt超过1024M!" >> /tmp/alert.txt fi #磁盘监控 #因为我们公司云服务器磁盘分区一般只有3个挂载点,所以只过滤3行结果 fenqu1=`df -h | grep "/$" |awk '{print $5}' | awk -F% '{print $1}'` fenqu2=`df -h | grep "/$" |awk '{print $5}' | awk -F% '{print $2}'` fenqu3=`df -h | grep "/$" |awk '{print $5}' | awk -F% '{print $3}'` if [ $fenqu1 -gt 90 ] then echo "警告:磁盘使用超过90%!" >> /tmp/alert.txt fi #fenqu2比较大小 if [ $fenqu2 -gt 90 ] then echo "警告:磁盘使用超过90%!" >> /tmp/alert.txt fi #fenqu3比较大小 if [ $fenqu3 -gt 90 ] then echo "警告:磁盘使用超过90%!" >> /tmp/alert.txt fi #CPU监控 IDLE=`expr 100 - $(mpstat | grep "all" | awk '{print $10}' | awk -F. '{print $1}')` if [ $IDLE -gt 80 ] then echo "警告:CPU使用超过80%!" >> /tmp/alert.txt fi #内存监控 USED=`free | grep "cache:" | awk '{print $3}'` TOTAL=`free | grep "Mem:" | awk '{print $2}'` neicun=`expr $USED * 100 / $TOTAL` if [ $neicun -gt 90 ] then echo "警告:内存使用超过90%!" >> /tmp/alert.txt fi #TCP连接数监控 TCP=`netstat -a | grep "ESTABLISHED"| awk -FESTABLISHED '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'` if [ $TCP -eq 200 ] then echo "警告:TCP连接数超过200!" >> /tmp/alert.txt fi #HTTP监控 #此URL存在,能返回200值 URL1=`curl -o /dev/null -s -w "%{http_code}" "http://baidu.com/index.html"` #此URL不存在,不能返回200值 #URL2=`curl -o /dev/null -s -w "%{http_code}" "http://baidu.com/index111.html"` #判断返回值是否等于200,不等于将报警 if [ $URL1 -ne 200 ] then echo "警告:http://baidu.com/index.html不可访问" > /tmp/alert.txt fi #if [ $URL2 -ne 200 ] #then # echo "警告:http://baidu.com/index111.html不可访问" > /tmp/alert.txt #fi #邮件报警 #判断是否存在/tmp/alert.txt文件 #以上所有监控超过阀值会产生/tmp/alert.txt文件,一旦有此文件,将触发邮件报警 if [ -f /tmp/alert.txt ] then /usr/local/mailx-12.4/mailx -s 115.29.185.2警告 lijc@wiselong.com < /tmp/alert.txt #删除之前有警报产生了/tmp/alert.txt文件,下次再产生会邮件报警,不产生不报警 rm -rf /tmp/alert.txt fi
设置任务计划
每10分钟运行一次监控脚本
chmod +x sysmon.sh crontab -e */10 * * * * /root/bin/sysmon.sh service crond restart