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