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腳本檢測端口,以便於您獲取更多的相關知識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM