为什么80%的码农都做不了架构师?>>>
#################################################
# 主机健康状态监控脚本
# (监控内容:内存、CPU、磁盘、网卡)
#
# V1.0 Writen by: MR.G Date:2012-03-20
##################################################
export LANG=C
#设定管理员的信箱
[email protected]
#设定日期格式
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