[linux中检测服务器服务与端口的什么作用]linux中检测服务器服务与端口的shell脚本

更新时间:2019-12-18    来源:邮件    手机版     字体:

【www.bbyears.com--邮件】


说明:
主程序:check_port
邮件联系人列表:contacts_list
端口列表文件:port_list
check_port脚本变量文件:profile_global
check_port邮件功能变量文件:profile_mail
具体修改参数参考脚本注释修改


check_port
邮件联系人列表

contacts_list
端口列表文件

#写入邮件联系人邮箱地址


port_list端口文件

192.168.10.15 80
192.168.10.15 8080
192.168.10.15 8081
192.168.10.15 8080
192.168.10.15 8089
192.168.10.15 9002
192.168.10.15 9005
192.168.10.15 9009
192.168.10.15 2222
192.168.10.17 2222
192.168.10.17 8080
192.168.10.54 2222
192.168.10.55 2222
192.168.10.55 8080
192.168.10.56 2222
192.168.10.56 80
192.168.10.56 8080
192.168.10.56 9999
192.168.10.56 3306
192.168.10.56 9000
192.168.10.56 5001
192.168.10.56 6001
192.168.10.56 7001
192.168.10.56 8081
192.168.10.57 2222
192.168.10.57 9000
192.168.10.57 8188

 

check_port脚本变量文件

#!/bin/bash 
#检测服务器端口是否开放,成功会返回0值,打不开会返回1值 
TEMDIR=/var/run
PRG="$0"
while [ -h "$PRG" ] ; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : ".*-> \(.*\)$"`
  if expr "$link" : "/.*" > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done
BASEDIR=`dirname "$PRG"`
source $BASEDIR/profile_global
PID_FILE=port.pid
#生成的日志目录
LOG_DIR=$BASEDIR/logs
if [[ ! -e $LOG_DIR ]];then
 mkdir -p $LOG_DIR
fi
do_start () {
while 1>0;do
source $BASEDIR/profile_global
if [[ ! -e $LOG_DIR ]];then
 mkdir -p $LOG_DIR
fi
if [[ -e $BASEDIR/$CHECK_FILE_LIST_NAME ]];then
 if [[ -s $BASEDIR/$CHECK_FILE_LIST_NAME ]];then
  cat $BASEDIR/$CHECK_FILE_LIST_NAME|grep -v "^#"|grep -v "^$"|while read i;do
  SSH_SERVER_IP=`echo "$i"|awk "{print $1}"`
  SSH_SERVER_PORT=`echo "$i"|awk "{print $2}"`
   nc -w 10 -z $i > /dev/null
   if [ $? -eq 0 ];then 
                echo "$(date)|$i|$MESSAGE_OK" >>$LOG_DIR/$LOG_FILE_NAME.ok.$TIME1
                if [[ -e $LOG_DIR/$LOG_FILE_NAME.$SSH_SERVER_IP.$SSH_SERVER_PORT.error.$TIME1 ]];then
      WC_ERROR_COUNTS=`wc -l $LOG_DIR/$LOG_FILE_NAME.$SSH_SERVER_IP.$SSH_SERVER_PORT.error.$TIME1|awk "{print $1}"`
      if [[ $WC_ERROR_COUNTS -le 3 ]];then
       /bin/rm -f $LOG_DIR/$LOG_FILE_NAME.$SSH_SERVER_IP.$SSH_SERVER_PORT.error.$TIME1
       echo "$(date)|$i|端口恢复正常,故障次数<=3次未触发邮件." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
      else
       /bin/rm -f $LOG_DIR/$LOG_FILE_NAME.$SSH_SERVER_IP.$SSH_SERVER_PORT.error.$TIME1
       if [[ $OPEN_CLOSE_MAIL -eq 1 ]];then
        if [[ -e $CONTACTS_FILE ]];then
         if [[ -s $CONTACTS_FILE ]];then
          source $BASEDIR/profile_mail
          echo "$i|$MESSAGE_RECOVERY"|$MAILX_BIN -s "$MAILX_OK_TITLE" $CONTACTS_LIST
          echo "$(date)|$i|端口恢复正常,已发邮件通知`cat $CONTACTS_FILE|grep -v "^#"|grep -v "^$"|xargs`." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
         else
          echo "$(date)|$i|端口恢复正常,当前联系人列表文件($CONTACTS_FILE)为空,发邮件失败." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
         fi
        else
         echo "$(date)|$i|端口恢复正常,当前邮件联系人列表文件($CONTACTS_FILE)不存在,发邮件失败." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
        fi
       else
        echo "$(date)|$i|端口恢复正常,当前设置为禁止发送邮件." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
       fi
      fi
                fi
   else 
                echo "$(date)|$i|$MESSAGE_ERR" >>$LOG_DIR/$LOG_FILE_NAME.$SSH_SERVER_IP.$SSH_SERVER_PORT.error.$TIME1
                ERR_COUNTS=`wc -l $LOG_DIR/$LOG_FILE_NAME.$SSH_SERVER_IP.$SSH_SERVER_PORT.error.$TIME1|awk "{print $1}"`
                if [[ $ERR_COUNTS -le 3 ]];then
     echo "$(date)|$i|端口异常." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
    elif [[ $ERR_COUNTS -gt 3 ]]&&[[ $ERR_COUNTS -le 6 ]];then
     if [[ $OPEN_CLOSE_MAIL -eq 1 ]];then
      if [[ -e $CONTACTS_FILE ]];then
       if [[ -s $CONTACTS_FILE ]];then
        source $BASEDIR/profile_mail
        echo "$i|$MESSAGE_ERR"|$MAILX_BIN -s "$MAILX_ERR_TITLE" $CONTACTS_LIST
        echo "$(date)|$i|端口异常,已发邮件通知`cat $CONTACTS_FILE|grep -v "^#"|grep -v "^$"|xargs`." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
       else
        echo "$(date)|$i|端口异常,当前联系人列表文件($CONTACTS_FILE)为空,发邮件失败." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
       fi
      else
       echo "$(date)|$i|端口异常,当前邮件联系人列表文件($CONTACTS_FILE)不存在,发邮件失败." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
      fi
     else
      echo "$(date)|$i|端口异常,当前设置为禁止发送邮件." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
     fi
                else 
     if [[ $OPEN_CLOSE_MAIL -eq 1 ]];then
      if [[ -e $CONTACTS_FILE ]];then
       if [[ -s $CONTACTS_FILE ]];then
        echo "$(date)|$i|端口异常,发邮件次数>=3次停止发送邮件." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
       else
        echo "$(date)|$i|端口异常,当前联系人列表文件($CONTACTS_FILE)为空." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
       fi
      else
       echo "$(date)|$i|端口异常,当前邮件联系人列表文件($CONTACTS_FILE)不存在." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
      fi
     else
      echo "$(date)|$i|端口异常,当前设置为禁止发送邮件." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
     fi
                fi
   fi
        done
 else
  /bin/rm -f $TEMDIR/$PID_FILE &>/dev/null
  if [[ -e $CONTACTS_FILE ]];then
   if [[ -s $CONTACTS_FILE ]];then
    source $BASEDIR/profile_mail
    if [[ $OPEN_CLOSE_MAIL -eq 1 ]];then
     echo "当前端口文件列表($BASEDIR/$CHECK_FILE_LIST_NAME)为空,检查异常,程序退出."|$MAILX_BIN -s "来自($CHECK_SERVER_IP)的端口告警程序异常退出" $CONTACTS_LIST
     echo "$(date)|当前端口文件列表($BASEDIR/$CHECK_FILE_LIST_NAME)为空,检查异常,程序退出,已发邮件通知`cat $CONTACTS_FILE|grep -v "^#"|grep -v "^$"|xargs`." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
     break
    else
     echo "$(date)|当前端口文件列表($BASEDIR/$CHECK_FILE_LIST_NAME)为空,检查异常,程序退出,当前设置为禁止发送邮件." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
     break
    fi
    break
   else
    echo "$(date)|当前端口文件列表($BASEDIR/$CHECK_FILE_LIST_NAME)为空,检查异常,程序退出,当前联系人列表文件($CONTACTS_FILE)为空,发邮件失败." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
    break
   fi
  else
   echo "$(date)|当前端口文件列表($BASEDIR/$CHECK_FILE_LIST_NAME)为空,检查异常,程序退出,当前邮件联系人列表文件($CONTACTS_FILE)不存在,发邮件失败." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
   break
  fi
 fi
else
 /bin/rm -f $TEMDIR/$PID_FILE &>/dev/null
 if [[ -e $CONTACTS_FILE ]];then
  if [[ -s $CONTACTS_FILE ]];then
   source $BASEDIR/profile_mail
   if [[ $OPEN_CLOSE_MAIL -eq 1 ]];then
    echo "当前端口文件列表($BASEDIR/$CHECK_FILE_LIST_NAME)不存在,检查异常,程序退出."|$MAILX_BIN -s "来自($CHECK_SERVER_IP)的端口告警程序异常退出" $CONTACTS_LIST
    echo "$(date)|当前端口文件列表($BASEDIR/$CHECK_FILE_LIST_NAME)不存在,检查异常,程序退出,已发邮件通知`cat $CONTACTS_FILE|grep -v "^#"|grep -v "^$"|xargs`." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
    break
   else
    echo "$(date)|当前端口文件列表($BASEDIR/$CHECK_FILE_LIST_NAME)不存在,检查异常,程序退出,当前设置为禁止发送邮件." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
    break
   fi
   break
   
  else
   echo "$(date)|当前端口文件列表($BASEDIR/$CHECK_FILE_LIST_NAME)不存在,检查异常,程序退出,当前联系人列表文件($CONTACTS_FILE)为空,发邮件失败." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
   break
  fi
 else
  echo "$(date)|当前端口文件列表($BASEDIR/$CHECK_FILE_LIST_NAME)不存在,检查异常,程序退出,当前邮件联系人列表文件($CONTACTS_FILE)不存在,发邮件失败." >>$LOG_DIR/$TOTAL_LOG_FILE.$TIME1
  break
 fi
fi
sleep 30
/bin/rm -f $LOG_DIR/$LOG_FILE_NAME.ok.$TIME2 >/dev/null 2>&1 &
/bin/rm -f $LOG_DIR/$TOTAL_LOG_FILE.$TIME2 >/dev/null 2>&1 &
done
}
do_stop () {
if [[ -e $TEMDIR/$PID_FILE ]];then
        if [[ -s $TEMDIR/$PID_FILE ]];then
    echo "停止端口检测服务,当前停止进程为`cat $TEMDIR/$PID_FILE`"|tee -a $LOG_DIR/$TOTAL_LOG_FILE.$TIME1
                cat $TEMDIR/$PID_FILE|xargs kill -9 >/dev/null 2>&1 &
                /bin/rm -f $TEMDIR/$PID_FILE &>/dev/null
        else
                echo "当前PID文件($TEMDIR/$PID_FILE)没有需要停止的进程,停止服务失败."
    exit 0
        fi
else
        echo "进程PID文件($TEMDIR/$PID_FILE)不存在,停止服务失败."
  exit 0
fi
}
do_status () {
if [[ -e $TEMDIR/$PID_FILE ]];then
        if [[ -s $TEMDIR/$PID_FILE ]];then
                echo "当前服务正在运行,运行进程ID为`cat $TEMDIR/$PID_FILE`"
        else
                echo "当前PID文件($TEMDIR/$PID_FILE)为空无法确定程序运行状态,具体请查看进程."
    exit 0
        fi
else
        echo "进程PID文件($TEMDIR/$PID_FILE)不存在,当前服务未运行."
  exit 0
fi
}
case $1 in
start)
if [[ ! -e $BASEDIR/$CHECK_FILE_LIST_NAME ]];then
 echo "$(date)|当前端口文件列表($BASEDIR/$CHECK_FILE_LIST_NAME)不存在,服务启动失败."|tee -a $LOG_DIR/$TOTAL_LOG_FILE.$TIME1
 exit 0
else
 if [[ ! -s $BASEDIR/$CHECK_FILE_LIST_NAME ]];then
  echo "$(date)|当前端口文件列表($BASEDIR/$CHECK_FILE_LIST_NAME)没有内容,服务启动失败."|tee -a $LOG_DIR/$TOTAL_LOG_FILE.$TIME1
  exit 0
 else
  if [[ -e $TEMDIR/$PID_FILE ]];then
   if [[ -s $TEMDIR/$PID_FILE ]];then
                echo "进程PID文件($TEMDIR/$PID_FILE)已存在,再次启动失败."
    exit 0
   else
                echo "进程PID文件($TEMDIR/$PID_FILE)已存在,但是为空,再次启动失败."
    exit 0
   fi
  else
   do_start &
   echo $! >$TEMDIR/$PID_FILE
   echo "当前端口检测服务成功启动,启动进程为:`cat $TEMDIR/$PID_FILE`"|tee -a $LOG_DIR/$TOTAL_LOG_FILE.$TIME1
  fi
 fi
fi
;;
stop)
do_stop
;;
status)
do_status
;;
*)
echo "{请使用$0 start|stop|status 的方式启停服务和查看服务状态.}"
esac


profile_global邮件功能变量文件

#!/bin/bash
PRG="$0"
while [ -h "$PRG" ] ; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : ".*-> \(.*\)$"`
  if expr "$link" : "/.*" > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done
BASEDIR=`dirname "$PRG"`
#当前检测的服务器的IP地址
CHECK_SERVER_IP="192.168.10.1"
#日志文件的头文件名
LOG_FILE_NAME=check_port
#总日志文件头文件名
TOTAL_LOG_FILE=total
#端口列表文件名称
CHECK_FILE_LIST_NAME=port_list
#邮件消息内容
MESSAGE_OK="端口检测正常."
MESSAGE_ERR="端口异常或人为关闭,具体登录服务器查看."
MESSAGE_RECOVERY="端口恢复正常."
#打开或关闭邮件功能
OPEN_CLOSE_MAIL=1
#邮件联系人文件名称(主要用于判断当前联系人列表是否存在是否为空,防止误发发邮件)
CONTACTS_FILE=$BASEDIR/contacts_list
#打印系统日期时间,已经3天前的时间(主要用于保存日志记录为3天,防止日志过多)
TIME1=$(date +%F)
TIME2=$(date -d -3day +%F)


profile_mail
具体修改参数参考脚本注释修改

#!/bin/bash
PRG="$0"
while [ -h "$PRG" ] ; do
  ls=`ls -ld "$PRG"`
  link=`expr "$ls" : ".*-> \(.*\)$"`
  if expr "$link" : "/.*" > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "$PRG"`/"$link"
  fi
done
BASEDIR=`dirname "$PRG"`
#发邮件程序的执行文件路径
MAILX_BIN=/usr/src/mailx-12.4/mailx
#邮件联系人列表文件
CONTACTS_LIST=`cat $BASEDIR/contacts_list|grep -v "^#"|grep -v "^$"`
#邮件消息内容,邮件标题
MAILX_OK_TITLE="来自($CHECK_SERVER_IP)的端口恢复正常通知."
MAILX_ERR_TITLE="来自($CHECK_SERVER_IP)的端口检测异常通知."

本文来源:http://www.bbyears.com/jsp/82978.html

热门标签

更多>>

本类排行