一个比较全面的SHELL监控脚本

#! /bin/sh
#################################################
#         主机健康状态监控脚本
#   (监控内容:内存、CPU、磁盘、网卡)
#
#    V1.0      Writen by: MR.G       Date:2012-03-20
##################################################


export LANG=C




#设定管理员的信箱
Email=zhangxiaogang@8tgame.com


#设定日期格式
time=`date "+%Y-%m-%d %H:%M:%S"`


#设定日志文件
log=`date +%Y-%m-%d`.log


#设定配置文件的路径
config=config.ini


if [[ -f $config && -s $config ]];then


        for ip in `cat $config`
                do
# -------------------------------------------------------------------------------------------------
# 检查服务器的状态,如果异常,则发送mail报警。
# -------------------------------------------------------------------------------------------------
        ssh $ip pwd &> /dev/null
        if [ $? -ne 0 ];then
                #echo "主机:$ip的SSH无法登陆,请及时处理!" | mail -s "$ip SSH状态异常" $Email
                 echo "$time $ip 的SSH状态检查完毕,状态:Failed.">>$log                
        else
                 echo "$time $ip 的SSH状态检查完毕,状态:Ok."   >>$log


# -------------------------------------------------------------------------------------------------
# 更新服务器的时间
# ----------------------------------------------------------
#设定NTP Server
server="ntp.fudan.edu.cn"


ssh $ip /usr/sbin/ntpdate -s $server
ssh $ip /usr/sbin/hwclock --systohc 
# -------------------------------------------------------------------------------------------------
# 检查服务器网络状态,如果无法ping通,则发送mail报警。(ICMP过滤的除外)
# -------------------------------------------------------------------------------------------------
#设定检测的网站
site=www.baidu.com


ssh $ip ping -c3 www.baidu.com >/dev/null
if [  $? -ne 0 ]; then


                   #echo "主机:$ip无法ping通,请及时处理!" | mail -s "$ip 磁盘空间警告" $Email
                        echo "$time $ip 的网络状态检查完毕,状态:Failed.">>$log
                else
                        echo "$time $ip 的网络状态检查完毕,状态:Ok."        >>$log
fi




# -------------------------------------------------------------------------------------------------
# 检查系统的磁盘空间,如果使用率超过90%,则发送mail报警。
# -------------------------------------------------------------------------------------------------


#设定的阀值
space_warn="90"


ssh $ip df -P | grep "^/dev"| awk '{print $0}' | while read x
        do
                space_name=`echo $x | awk '{print $1}'`
                space_per=`echo $x | awk '{print $5}' | sed 's/%//g'`
                space_used=`echo $x | awk '{print $3}'`
                if [ $space_per -ge $space_warn ];then
                                #echo "主机:$ip的$space_name分区仅剩下$space_used M,使用率为$space_per,已超过指定阀值,请及时处理!" | mail -s "$ip 磁盘空间警告" $Email
                                echo -e "$time $ip 的$space_name分区检查完毕,状态:Failed.">>$log
                        else
                                echo -e "$time $ip 的$space_name分区检查完毕,状态:Ok."        >>$log                
                fi
        done




# -------------------------------------------------------------------------------------------------
# 检查系统的内存状态,如果交换分区的使用率超过80%,则发送mail报警。
# -------------------------------------------------------------------------------------------------


#设定的阀值
swap_warn=80


swap_total=`ssh $ip free -m | grep "Swap" | awk '{print $4}'` 
swap_free=`ssh $ip free -m | grep "Swap" | awk '{print $2}' `
swap_used=`ssh $ip free -m | grep "Swap" | awk '{print $3}' `


if [ $swap_used -ne 0 ];then
        swap_per=$[[$swap_used / $swap_total]*100]
        if [ $swap_per -ge $swap_warn ];then
                        #echo "主机:$ip的Swap交换分区仅剩下$swap_free M,使用率为$swap_per,已超过指定阀值,请及时处理!" | mail -s "$ip 内存使用警告" $Email
                        echo "$time $ip的Swap分区检查完毕,状态:Failed." >> $log
                else
                        echo "$time $ip的Swap分区检查完毕,状态:Ok." >> $log
                fi
fi        


# -------------------------------------------------------------------------------------------------
# 检查系统CPU的状态,如果使用率超过80%,则发送mail报警
# -------------------------------------------------------------------------------------------------


#设定的阀值
cpu_warn=80


cpu_free=`ssh $ip top -b -n 1 | grep "Cpu" | awk '{print $5}' | sed 's/%id,//g'`
cpu_used=$(echo "100 - $cpu_free" | bc)


if [ `echo "$cpu_used >= $cpu_warn" | bc ` -eq 1 ];then
                #echo "主机:$ip的CPU使用率为$cpu_used%,已超过指定阀值,请及时处理!" | mail -s "$ip CPU使用警告" $Email
                echo "$time $ip 的CPU状态检查完毕,状态:Failed." >> $log
        else
                echo "$time $ip 的CPU状态检查完毕,状态:Ok." >> $log        
fi


# -------------------------------------------------------------------------------------------------
# 检查系统登陆的用户数,如果当前用户数超过3个,则发送mail报警
# -------------------------------------------------------------------------------------------------


#设定的阀值
users_max=4


users_now=`ssh $ip uptime | awk '{print $4}'`


if [ $user_now >=$users_max ];then
                #echo "$ip登陆的用户数已经达到了$user_nowg个,已超过指定的阀值,请及时处理!" | mail -s "$ip 用户数报警" $Email
                echo "$time $ip的用户数检查完毕,状态:Failed." >> $log
        else
                echo "$time $ip 的用户数检查完毕,状态:Ok." >> $log        
fi


# -------------------------------------------------------------------------------------------------
# 检查系统十五分钟内的平均负载情况,如果超过0.7(单核),则发送mail报警
# -------------------------------------------------------------------------------------------------


#设定的阀值
load_warn=0.7


cpu_num=`ssh $ip cat /proc/cpuinfo | grep -c "model name"`


load_num=`ssh $ip uptime | awk '{print $10}'`


load_average=`echo "scale=2;$load_num/$cpu_num" | bc`


if [ `echo "$load_average >= $load_warn" | bc` -eq 1 ];then
                #echo "$ip 15分钟单核的平均负载已经达到$load_average,已超过指定的阀值,请及时处理!" | mail -s "$ip 平均负载报警" $Email
                echo "$time $ip 的平均负载检查完毕,状态:Failed." >> $log
        else
                echo "$time $ip 的平均负载检查完毕,状态:Ok." >> $log        
fi




# -------------------------------------------------------------------------------------------------
# 检查系统当前的IP连接数,如果超过8000,则发送mail报警
# -------------------------------------------------------------------------------------------------


#设定的阀值
conns_warn=8000


ip_conns=`ssh $ip netstat -an | grep tcp | grep EST | wc -l`


if [ $ip_conns -ge $conns_warn ];then
        #echo "$ip 的IP连接数已经达到$ip_conns,已超过指定的阀值,请及时处理!" | mail -s "$ip IP连接数" $Email
                echo "$time $ip 的IP连接数检查完毕,状态:Failed." >> $log
        else
                echo "$time $ip 的IP连接数检查完毕,状态:Ok." >> $log        
        
fi




# -------------------------------------------------------------------------------------------------
# 检查系统Apache服务的运行状态,如果不返回200,则发送mail报警
# -------------------------------------------------------------------------------------------------


httpd=`ssh $ip ps -ef  |grep httpd |awk '{if($3==1)print $0}'|awk '{if($1=="root")print $3 }'`


if [ "$httpd" != "1" ];then
        echo "$time $ip Apache状态异常,尝试重启进程……" >> $log
        ssh $ip /etc/init.d/httpd restart &> /dev/null
        ssh $ip sleep 100
        httpd=`ssh $ip ps -ef  |grep httpd |awk '{if($3==1)print $0}'|awk '{if($1=="root")print $3 }'`
        if [ "$httpd" != "1" ];then
                result=`wget -o /dev/stdout "http://$ip/" | grep "HTTP"| awk '{print $6}'`
                if [ "$result" != "200" ];then
                         #echo "主机:$ip 的Apache服务已经没有响应,请及时处理!" | mail -s "$ip Apache服务警告" $Email
                         echo "$time $ip 的Apache状态检查完毕,状态:Failed." >> $log
                else
                        echo "$time $ip 的Apache状态检查完毕,状态:Ok." >> $log
                
                fi
        else
                   #echo "主机:$ip 的Apache服务已经没有响应,请及时处理!" | mail -s "$ip Apache服务警告" $Email
                echo "$time $ip 的Apache状态检查完毕,状态:Failed." >> $log                        
        fi
else
        result=`wget -o /dev/stdout "http://$ip/" | grep "HTTP" | awk '{print $6}'`
                if [ "$result" != "200" ];then
                         #echo "主机:$ip 的Apache服务已经没有响应,请及时处理!" | mail -s "$ip Apache服务警告" $Email
                         echo "$time $ip 的Apache状态检查完毕,状态:Failed." >> $log
                else
                        echo "$time $ip 的Apache状态检查完毕,状态:Ok." >> $log


                fi
fi






# -------------------------------------------------------------------------------------------------
# 检查系统MySQL服务的运行状态,通过检查端口3360,若重启后不正常发送mail报警(没有考虑锁表的情况)
# -------------------------------------------------------------------------------------------------




PORT=`ssh $ip netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $5}'`




if [ $PORT -eq 3306 ];then
        echo "$time $ip 的MySQL状态检查完毕,状态:Ok." >> $log
else
        echo "$time $ip MySQL状态异常,尝试重启进程……" >> $log
        ssh $ip /etc/init.d/mysqld restart &>/dev/null
        PORT=`ssh $ip netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $5}'`
        if [ $PORT -eq 3306 ];then
                        echo "$time $ip 的MySQL状态检查完毕,状态:Ok." >> $log
       else
                        #echo "主机:$ip 的MySQL服务已经没有响应,请及时处理!" | mail -s "$ip MySQL服务警告" $Email
                 echo "$time $ip 的MySQL状态检查完毕,状态:Failed." >> $log
       fi
fi






# -------------------------------------------------------------------------------------------------
# 检查系统网卡的流速情况,如果超过指定的阀值,则发送mail报警
# -------------------------------------------------------------------------------------------------


#设定的阀值,单位KB/S
speed_warn=10240


send_before=`ifconfig eth0 | grep bytes | awk '{print $6}' | awk -F : '{print $2}'`
recv_before=`ifconfig eth0 | grep bytes | awk '{print $2}' | awk -F : '{print $2}'`


sleep 1


send_after=`ifconfig eth0 | grep bytes | awk '{print $6}' | awk -F : '{print $2}'`
recv_after=`ifconfig eth0 | grep bytes | awk '{print $2}' | awk -F : '{print $2}'`


send_bytes=`expr $send_after - $send_before`
recv_bytes=`expr $recv_after - $recv_before`


send_speed=`expr $send_bytes / 1024`
recv_speed=`expr $recv_bytes / 1024`


if [[ `echo "$send_speed >= $speed_warn" | bc` -eq 1  || `echo "$recv_speed >= $speed_warn" | bc` -eq 1 ]];then
                # echo "$ip 的网卡流速为$send_speed Kb/s(上行)/$recv_speed Kb/s(下行),已超过指定的阀值,请及时处理!" | mail -s "$ip 平均负载报警" $Email
                echo "$time $ip 的网卡流速检查完毕,状态:Failed." >> $log
        else
                echo "$time $ip 的网卡流速检查完毕,状态:Ok." >> $log        
fi




fi        
                done
else
        echo  "配置文件不存在或内容为空,请检查!"


fi

转载于:https://my.oschina.net/liting/blog/406190

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值