zoukankan      html  css  js  c++  java
  • linux中检测服务器服务与端口的shell脚本

    https://yq.aliyun.com/ziliao/106027

    https://yq.aliyun.com/ziliao/65927?spm=a2c4e.11155472.blogcont.23.7fe76988W6oBo9

    linux中检测服务器服务与端口的shell脚本

     

    linux中检测服务器服务与端口的shell脚本 - 摘要: 本文讲的是linux中检测服务器服务与端口的shell脚本, 说明: 主程序:check_port 邮件联系人列表:contacts_list 端口列表文件:port_list check_port脚本变量文件:profile_global check_port邮件功能变量文件:profi


    说明:
    主程序: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)的端口检测异常通知."

    以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索异常 , 文件 , 邮件 , 程序 , 进程 端口 shell脚本登录服务器、shell脚本连接服务器、服务器 执行shell脚本、shell脚本判断端口、shell脚本检测端口,以便于您获取更多的相关知识。

  • 相关阅读:
    [LeetCode#114]Flatten Binary Tree to Linked List
    [LeetCode#103]Binary Tree Zigzag Level Order Traversal
    [LeetCode#102]Binary Tree Level Order Traversal
    [LeetCode#145]Binary Tree Postorder Traversal
    [LeetCode#]Binary Tree Preorder Traversal
    [LeetCode#144]Binary Tree Preorder Traversal
    [LeetCode#94]Binary Tree Inorder Traversal
    [LeetCode#101]Symmetric Tree
    [LeetCode#100]Same Tree
    [LeetCode#104, 111]Maximum Depth of Binary Tree, Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/erma0-007/p/8655646.html
Copyright © 2011-2022 走看看