centos5.8下用shell脚本监控服务器

此监控脚本适用于centos5.8,在其他系统下不能保证监控脚本全部有效,可以将监控脚本里面的命令逐一测试。

配置邮件服务

想通过linux监控网站或者系统状况并自动报警,如何使用脚本发出邮件给外部邮箱呢?

CentOS5自带的mailx是8.1版本的,不支持配置外部公网邮箱,可升级到最新版本12.4。

查看centos5.8自带的版本

rpm -qa | grep mailx

clip_image002

官方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-12.4

如此即安装完毕。这时,如果没有卸载旧版本的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

到外部邮箱一看,邮件即刻收到了。

clip_image004

当然我们也可以将一个文件的内容作为邮件的正文发出去

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
原文地址:https://www.cnblogs.com/theitnotes/p/4162921.html