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脚本检测端口,以便于您获取更多的相关知识。

转载于:https://www.cnblogs.com/erma0-007/p/8655646.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值