Shell 写的 Linux 服务器 几个监控点

如果是服务器少还好说。如果管理的服务器多服务器的监控是少不了的,
可以用软件监控也可以用 shell 来做监控
列如 我陪到 好几次 服务器 磁盘空间不够了。。
网速被服务器托管给降下来。。等等

上次写的那个shell 有一点点问题。这次改正了。
还是老样子   有问题发邮件提示。
用Android 做邮件接收的软件还在开发中。。由于空闲时间比较少。。开发进度比较慢。。。
不过我们老板告诉我一个解决的办法了。
用 移动 的 139 邮箱。在邮箱里设置 收到邮件立即发短信通知   ,,大家可以式式。。


# !/bin/bash
# @author : chase or 诺瓦
# date 2010-09-23

########################################################################
# This scripts is checking the network and Cpu and disk and memory , vision 2.1 Bate
# 监控 检查   带宽 、Cpu 、磁盘 、内存
# Write by finddream
# If you have some advise about it ,you can mail : [email protected] or QQ : 287781459
########################################################################


## variable   ## 如果没有设环境变量就必须得加入
#   ECHO=/bin/echo
#   SED=/bin/sed
#   AWK=/bin/awk
#   UPTIME=/bin/uptime
#   VMSTAT=/usr/bin/vmstat
#   FREE=/usr/bin/free
#   IPTABLES=/sbin/iptables
#   GREP=/bin/grep
#   TOP=/usr/bin/top
#   HEAD=/usr/bin/head
#   DF=/bin/df
#   CAT=/bin/cat


typeset inv in_old dif_in
typeset out out_old dif_out
typeset timer
typeset eth

# info and logs main dir 记录信息的主目录
DIR_PATH='/home/logs'    ## 信息存放的主目录
DATA_V="`date`"      ## 时间
HOSTNAMEL="`hostname`"    ## 主机名

eth='eth0'       ## 网卡
timer=3        ## 监检多少时间

# 邮件
MAIL_title="warning: server name=>$HOSTNAMEL"
MAIL_Etitle="error: server name=>$HOSTNAMEL"
MAIL_TO="[email protected]"
MESSAGE="$DIR_PATH/mail_message.log"

#####
# @author : chase or 诺瓦
# cpu

NOW_CPU=`top -n 1 |grep 'Cpu(s)' |awk -F '%' '{print $1}' | awk -F ' ' '{print $2}' | awk -F . '{print $1}'`
echo "Time: $DATA_V ==> CPU : $NOW_CPU">>"$DIR_PATH/cpul.log"

# CPU 超过 98% 发邮件 通知
if [ "$NOW_CPU" -ge "95" ]; then
echo "Time: $DATA_V ==> CPU : $NOW_CPU %">>"$DIR_PATH/cpu_log.log"

echo "Time: $DATA_V , server name : $HOSTNAMEL ==> CPU : $NOW_CPU % ">>$MESSAGE
mail -s "$MAIL_TITLE cpu" "$MAIL_TO" < $MESSAGE
rm -rf $MESSAGE


##################################### web server
# @author : chase or 诺瓦

# 是 apache 就可以重启 apache
if [ "$NOW_CPU" -ge "99" ]; then

   /www/servers/httpd-2.2.15/bin/httpd -k stop
   sleep 1;
   #rm -fr /www/web/iximo/wwwiximo/temp/compiled/*
   /www/servers/httpd-2.2.15/bin/httpd -k start
 
   echo "apache restart =>Time:$DATA_V ,Host:$HOSTNAMEL == CPU : $NOW_CPU ">>"$DIR_PATH/httpd_restart.log";
 
 
   # 判断是否己启动   四次循环
   wcount=1
   twhile=true
        while [ twhile ]
        do
           # 休息 2 秒
     sleep 2;
         
           tinfo_val=`curl http://www.6688.cc/check.php`
           if [ $tinfo_val == "ok" ]
           then     # 己启动
     
       twhile=false
             break;
           else     #   没启动成功 重启启动
             # rm -fr /www/web/iximo/wwwiximo/temp/compiled/*
             /www/servers/httpd-2.2.15/bin/httpd -k start
           
           fi
   
   
     # 启动四次还没有成功
           let "wcount = $wcount + 1"
           if [ "$wcount" -gt "4" ]; then
            echo "apache start error =>Time:$DATA_V ,Host:$HOSTNAMEL">>"$DIR_PATH/httpd_error.log";
    
      echo "Time: $DATA_V , server name : $HOSTNAMEL ==> apache : restart fail ">>$MESSAGE
      mail -s "$MAIL_ETITLE error apache" "$MAIL_TO" < $MESSAGE
      rm -rf $MESSAGE
    
      twhile=false
            break;
           fi
         
           sleep 1;
        done
 
fi
#####################################   web server

fi


#####
# @author : chase or 诺瓦
# 带宽
in_old=$(cat /proc/net/dev | grep $eth | sed -e "s/\(.*\)\:\(.*\)/\2/g" | awk ' { print $1 }' )
out_old=$(cat /proc/net/dev | grep $eth | sed -e "s/\(.*\)\:\(.*\)/\2/g" | awk ' { print $9 }' )

sleep ${timer}

inv=$(cat /proc/net/dev | grep $eth | sed -e "s/\(.*\)\:\(.*\)/\2/g" | awk ' { print $1 }' )
out=$(cat /proc/net/dev | grep $eth | sed -e "s/\(.*\)\:\(.*\)/\2/g" | awk ' { print $9 }' )
dif_in=$(((in-in_old)/timer))
dif_out=$(((out-out_old)/timer))
echo "Time: $DATA_V ==>IN: ${dif_in} Byte/s OUT: ${dif_out} Byte/s">>"$DIR_PATH/networkl.log"

#####
# @author : chase or 诺瓦
# 磁盘
# 可以一周或一天检查一次
# df -h |grep / |uniq|sort|tr -s " "|cut -d " " -f 4-6
#
# df |grep / |uniq|sort|tr -s " "|awk -F '%' '{print $1}'|cut -d " " -f 5|sort -n | tail -n 1
#

# 记录磁盘
echo " ">>"$DIR_PATH/fdiskl.log"
echo "Time: $DATA_V ==> fdisk Space ===================================">>"$DIR_PATH/fdiskl.log"
echo "`df -h |grep / |uniq|sort|tr -s " "|cut -d " " -f 4-6`">>"$DIR_PATH/fdiskl.log"

# 磁盘到了一定的空间 发邮件给我 百分比 90% 通知我
typeset diskfile
diskfile=`df |grep / |uniq|sort|tr -s " "|awk -F '%' '{print $1}'|cut -d " " -f 5|sort -n | tail -n 1`
if [ "$diskfile" -ge "90" ]; then
echo "Time: $DATA_V ==>fdisk $diskfile % ===================================">>"$DIR_PATH/fdisk_full.log"
echo "Time: $DATA_V , server name : $HOSTNAMEL ==> fdisk : $diskfile % ">>$MESSAGE
mail -s "$MAIL_TITLE fdisk" "$MAIL_TO" < $MESSAGE
rm -rf $MESSAGE
fi

#####
# @author : chase or 诺瓦
# 内存 己用百分比
#
typeset mpercent
mpercent=`free -m |grep /cache |tr -s " " | awk -F '/cache' '{print $2}' |awk -F ' ' '{agvt=$2/($2+$3)*100; print agvt}' | awk -F '.' '{print $1}'`
echo "Time: $DATA_V ==>memory $mpercent %">>"$DIR_PATH/memory.log"

if [ "$mpercent" -ge "95" ]; then ## 95% 发邮件
echo "Time: $DATA_V ==>memory $mpercent %">>"$DIR_PATH/memory_warning.log"
echo "Time: $DATA_V , server name : $HOSTNAMEL ==> memory : $mpercent %">>$MESSAGE
mail -s "$MAIL_TITLE memory" "$MAIL_TO" < $MESSAGE
rm -rf $MESSAGE
fi

相关推荐