服务器异常监控脚本

 因为服务器上的服务或者应用程序会出现挂掉的情况,所以需要做一套脚本来监控相关的进程和程序。
 也调查了相关的第三方,但都没有合适的,要么收费,要么就是比较重量级的。

这里写图片描述

 基本实现需求如下:

这里写图片描述

 以下是相关代码,希望对有需要的朋友有所帮助,shell一直没用过,有不足之处请指出。

相关的公用配置信息

export LOGPATH="/chroot/wwwlogs/checklogs"  #日志目录
export DATE=`date +%Y%m%d-%H`               #年月日时
export DATETIME=`date +%Y%m%d-%H:%M`      
export MAINSERVER="127.0.0.145"           #当前服务器IP
mkdir -p /chroot/wwwlogs/checklogs          #创建日志目录

验证指定的进程是否存在

checkProcess(){
  HOST=$1
  PROCESS=$2
  local MESSAGE=""
  local RET="0"
  #验证进程是否存在
  status=`ps -A | grep $PROCESS`
  if [ "$status" !=  "" ] 
  then
     MESSAGE="服务:(${PROCESS}),进程存在(执行函数checkProcess)."
     RET="1"   
  else 
     MESSAGE="服务:(${PROCESS}),进程不存在(执行函数checkProcess)."
     RET="0"
     #发送邮件提示通知
  fi
  #调用信息处理函数
  showMessage $MESSAGE $RET;
  return 0;
}

#主要指对本台主机的服务检测
#循环检测Mysql、Nginx、PHP进程是否存在
PROCESS=('mysql' 'nginx' 'php')  #进程名称
for ((i=0; i<"${#PROCESS[*]}"; i++))
do
  checkProcess $MAINSERVER ${PROCESS[$i]}
done

ping指定的服务器是否正常

#
#  ping指定的服务器是否通
#  $1 当前服务器IP地址
#  $2 ping的对方服务器IP地址
#  $3 对ping的服务器描述信息
# 
pingCmd(){  
  PRE="server$1Ping$2,($3)"
  ping -w 1 -c 1 $2>/dev/null
  ret=$?
  MESSAGE=""
  MRET="0"
  if [ $ret -eq 0 ]
  then
     MESSAGE="命令($PRE),状态OK(执行函数pingCmd)"
     MRET="1"
  else
     MESSAGE="命令($PRE),状态ERROR(执行函数pingCmd)"
     MRET="0"
     #发邮件提示
  fi
  #调用信息处理函数
  showMessage $MESSAGE $MRET
  return 0
}

#主要指对其它服务器的ping操作
#循环ping多台服务器
SERVERS_IP=('127.0.0.1' '127.0.0.2')  #验证服务器的IP地址
SERVERS_DESCRIPTION=('服务器A' '服务器B' ) #验证服务器的描述
for ((i=0; i<"${#SERVERS_IP[*]}"; i++))
do
  pingCmd $MAINSERVER ${SERVERS_IP[$i]} ${SERVERS_DESCRIPTION[$i]}
done

登录指定服务器Mysql是否成功

#
#  验证指定服务器的Mysql是否可以登录
#  $1 当前服务器IP地址
#  $2 ping的对方服务器IP地址
#  $3 对ping的服务器描述信息
# 
loginMysql(){
  #mainserver=$1
  local host=$1
  local port='3306'
  local user=$2
  local password=$3
  mysqlclient='mysql'
  $mysqlclient --host=$host --port=$port --user=$user --password=$password  -e "show databases;" > /dev/null 2>&1
  MESSAGE=""
  RET="0"
  if [ $? == 0 ]
  then
      MESSAGE="ip:($host),mysql登录successfully"
      RET="1"
  else
      MESSAGE="ip:($host),mysq登录faild"
      RET="0"
  fi
  #调用信息处理函数
  showMessage $MESSAGE $RET
}

#主要指对本机或其它服务器的Mysql登录操作
#登录Mysql验证是否登录成功
HOST=('127.0.0.1')               #服务器IP
USER=('user')        #Mysql用户名
PASSWORD=('password')    #Mysql密码
for ((i=0; i<"${#HOST[*]}"; i++))
do
  loginMysql ${HOST[$i]} ${USER[$i]} ${PASSWORD[$i]}
done

指定的Tomcat服务是否存在

#
#  验证tomcat进程状态
#  $1 tomcat路径
#  $2 端口号
#  $3 tomcat项目描述
# 
checkTomcat(){
   TOMCATPATH=$1
   TOMCATPORT=$2
   TOMCATDESCRIPTION=$3;
   cd $TOMCATPATH
   pIDa=`/usr/sbin/lsof -i :$TOMCATPORT|grep -v "PID" | awk '{print $2}'`
   #echo $pIDa;
   MESSAGE=""
   RET="0"
   if [ "$pIDa" != "" ];
   then
     MESSAGE="tomcatPath:$TOMCATPATH;tomcatPort:$TOMCATPORT($TOMCATDESCRIPTION);进程存在.";
     RET="1"
   else
     MESSAGE="tomcatPath:$TOMCATPATH;tomcatPort:$TOMCATPORT($TOMCATDESCRIPTION);进程不存在.";
     RET="0"
   fi  
   #调用信息处理函数
   showMessage $MESSAGE $RET
}

#主要指对本机的Tomcat服务操作
#循环检测多个Tomcat状态
TOMCAT_PATH=('/data/server/apache-tomcat-aa/' '/data/server/apache-tomcat-bb/') #tomcat地址
TOMCAT_PORT=('9558' '8544')                                                              #tomcat端口
TOMCAT_DESCRIPTION=('项目AA' '项目BB')         #tomcat项目描述
for ((i=0; i<"${#TOMCAT_PATH[*]}"; i++))
do
  checkTomcat ${TOMCAT_PATH[$i]} ${TOMCAT_PORT[$i]} ${TOMCAT_DESCRIPTION[$i]}
done

检测网站的状态是否返回200

#
#  验证Web网站是否返回200状态码
#  $1 网站的URL
#  $2 网站的名称
# 
checkWebsite(){
  WEBSITE=$1
  DESCRIPTION=$2
  CODE=`curl -A "Mozil5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0" -o /dev/null -s -m 10 -e "api.snaillove.com" -w %{http_code} $WEBSITE`
  #echo "checkWebsite..CODE===$CODE";
  MESSAGE=""
  RET="0"
  if [ $CODE == "200" ]
  then
      MESSAGE="网站$DESCRIPTION($WEBSITE)访问正常"
      RET="1"
  else
      MESSAGE="网站$DESCRIPTION($WEBSITE)访问失败"
      RET="0"
  fi
  #调用信息处理函数
  showMessage $MESSAGE $RET  
}

#主要指对相关网页状态的操作
#循环检测多个网页URL状态码是否200
WEBSITE=('aa.bb.com' 'cc.bb.com')  #网站地址
WEBSITEDESCRIPTION=('项目A' '项目B') #网站描述
for ((i=0; i<"${#WEBSITE[*]}"; i++))
do
  checkWebsite ${WEBSITE[$i]} ${WEBSITEDESCRIPTION[$i]}
done

统一的结果处理方法

#
#  统一日志和信息输出函数
#  $1 提示内容
#  $2 运行结果状态值
# 
#export SENDMAILS="xianglingchuan@sina.cn"
showMessage(){
   local MESSAGE=$1;
   local RET=$2;
   INFO="IP:($MAINSERVER) TIME:$DATETIME RET:$RET MESSAGE: $MESSAGE\n"
   echo $INFO;
   echo -e "$INFO" >> $LOGPATH/$DATE.log;
   #发送邮件命令
      if [ $RET -eq 1 ]
   then
     echo "状态正常不用发送邮件.\n"
   else
     echo "发送异常邮件.\n"
     MAILINFO="<b>IP:</b>($MAINSERVER)<BR><BR><B>TIME:</B>$DATETIME<BR><BR><B>RET:</B>$RET<BR><BR><B>MESSAGE:</B>$MESSAGE<BR><BR>"
     echo "$MAILINFO" | mail -s "$(echo -e "$MAINSERVER 服务器监控异常通知\nContent-Type: text/html")" $SENDMAILS
   fi
   return 1; 
}

然后在crontab中添加如下代码,就可以完成对相关服务的监控了。
每三分钟进行一次访问。

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
 */3 *  *  *  * root sh /chroot/shell/checkServer.sh >> /chroot/wwwlogs/checkServer.log
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值