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

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

时间: 2024-11-01 14:10:22

linux中检测服务器服务与端口的shell脚本的相关文章

linux中自动分区、格式化、挂载shell脚本

功能:自动检测是否有尚未分区的数据盘,格式化新的数据盘并自动挂载 解决了什么问题:一键式检测是否有尚未分区的数据盘,并能对其格式化和自动挂载,省去了复杂的命令和步骤 执行方法:以root身份执行命令  代码如下 复制代码 wget http://mirrors.linuxeye.com/scripts/auto_fdisk.sh chmod +x auto_fdisk.sh ./auto_fdisk.sh 结果: 脚本内容如下:  代码如下 复制代码 #!/bin/bash # Author: 

Linux退出后要如何限制IP登录Shell脚本

Linux系统虽然比Windows系统安全很多,是很好的程序开发环境,但多少还是存在一些安全隐患的.在Linux用户退出系统后,还是会有多个IP登录的风险,那么Linux退出后要如何限制IP登录Shell脚本呢?下面小编介绍一些实例. 生产环境中,有可能会出现被其他管理员或使用者修改hosts.allow允许更多的ip登陆机器;为了方便统一管理,我们可以在用户退出的时候统一修改allow和deny文件成默认设置.同时也能自动获取机器所配ip的整个ip段为允许登陆. test -f /root/.

Linux中安装Memcached服务

下载并安装Memcache服务器端 服务器端主要是安装memcache服务器端. 下载:http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz 另外,Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent,libevent的最新版本是libevent-1.3.(如果你的系统已经安装了libevent,可以不用安装) 官网:http://www.monkey.org/~provos/libev

linux中Samba服务器的搭建理论篇

一.Samba与NFS.ftp   在了解Samba服务之前,需要先了解一下cifs协议(Common Internet File System),该协议最早是微软搞出来的一个协议.cifs 协议最早实现的是window主机之间的文件共享与打印共享,并不支持在linux上运行,samba是由Andrew Tridgell工程师通过逆向工程实现的一个cifs协议软件.通过该包可以实现windows和linux之间的文件共享.这和NFS的走的路刚好相反,NFS最初只支持在类unix系统上运行,后被w

linux中Web服务器Nginx多方位优化策略

Nginx(读音engine x)服务器由于性能优秀稳定.配置简单以及跨平台,被越来越多的公司和个人所采用,现已成为市场份额继Apache之后的第二大Web服务器.各大小网站论坛博客也介绍说明了Nginx从安装到优化的各种配置.不过看了很多这些相关Nginx的文档之后,发现一个比较大的问题,就是这些文档基本也就从两个方面着手,一是修改Nginx的配置文件,二是调整操作系统的相关内核参数:而且文档说明也不够明了,缺乏比较系统级别的优化.本文将从Nginx源码编译安装开始,到修改配置文件,调整系统内

Linux中VPS 服务器安全设置教程

在开通了 Linux 系统的 VPS 或服务器后,我们有必要做一些基本的安全设置. 一.关闭 SSH 密码登陆 首先,你需要有自己的 SSH Key,如果你使用 Windows 系统,可以用 Putty 下的 PUTTYGEN.EXE 生成私匙和公匙. 第一步,运行 PUTTYGEN.EXE 一般,我们选择默认的 RSA 加密即可,默认的 1024 位加密足够用,如果要保险点,可以选择 2048 或 4096 位加密,如图红圈处: 第二步,点击 Generate ,然后鼠标随意在空白处移动 等进

Linux中e-mail服务器的安装与配置

随着互联网的发展,e-mail迅速成长成为主要的网络http://www.aliyun.com/zixun/aggregation/38653.html">信息传递工具.面对大量要求能够快速,廉价,和高可信赖的e-mail需求,很多公司和个人都把linux提供的服务作为满足这些需求的解决方案. redhat7.1默认安装的时间已经安装了SendMail 8.11服务.因为redhat安装使用都非常的简单,我们这里就忽略安装过程,相关资料请查阅redhat CD里的文档.要使你的新e-mai

Linux中NFS服务器的安装与配置

NFS是Net http://www.aliyun.com/zixun/aggregation/19352.html">File System的简写,即网络文件系统. 网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与它人共享目录和文件.通过使用NFS,用户和程序可以象访问本地文件一样访问远端系统上的文件. 以下是NFS最显而易见的好处: 1.本地工作站使用更少的磁盘空间,因为通常的数据可以存放在一台机器上而且可以通过网络访问到. 2.用户不

linux中git服务器搭配教程

例子一 先看疗效: 1. 无需公钥 2. 只需要几个最常用的Linux命令就可以搭建   看步骤 1. 准备Linux服务器, 安装好git(一般都是默认装好的) 2. 命令行操作 useradd git   #创建一个git账号 passwd git    #设置git账号的密码 su – git    #切换到git账号 cd ~  #转到用户目录 mkdir 项目名称.git   #建立项目git文件夹 cd 项目名称.git git –-bare –share init   #初始化gi