|
1.创建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"`
PID_FILE=port.pid
#生成的日志目录
LOG_DIR=$BASEDIR/logs
start () {
while 1>0;do
LOG_FILE_NAME=check_port
MESSAGE_OK='端口检测正常'
MESSAGE_ERR='端口检测异常'
MESSAGE_RECOVERY='端口恢复正常'
MAILX_BIN=/usr/local/bin/mailx
MAILX_OK_TITLE='来自(192.168.10.56)端口检测端口恢复正常通知'
MAILX_ERR_TITLE='来自(192.168.10.56)端口检测端口检测异常'
CONTACTS_LIST=`cat $BASEDIR/contacts_list`
TIME1=$(date +%F)
TIME2=$(date -d -3day +%F)
if [[ -e $LOG_DIR ]];then
cat $BASEDIR/port_list|while read i;do
nc -w 10 -z localhost $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.$i.error.$TIME1 ]];then
/bin/rm -rf $LOG_DIR/$LOG_FILE_NAME.$i.error.$TIME1
echo "$i$MESSAGE_RECOVERY"|$MAILX_BIN -v -s "$MAILX_OK_TITLE" $CONTACTS_LIST
fi
else
echo "$i$MESSAGE_ERR" >>$LOG_DIR/$LOG_FILE_NAME.$i.error.$TIME1
ERR_COUNTS=`wc -l $LOG_DIR/$LOG_FILE_NAME.$i.error.$TIME1|awk '{print $1}'`
if [[ $ERR_COUNTS -le 3 ]];then
echo "$i$MESSAGE_ERR"|$MAILX_BIN -v -s "$MAILX_ERR_TITLE" $CONTACTS_LIST
else
echo "$(date)|当前端口发邮件次数超出限制的3次停止发送邮件" >>$LOG_DIR/$LOG_FILE_NAME.$i.error.$TIME1
fi
fi
done
else
mkdir $LOG_DIR
cat $BASEDIR/port_list|while read i;do
nc -w 10 -z localhost $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.$i.error.$TIME1 ]];then
/bin/rm -rf $LOG_DIR/$LOG_FILE_NAME.$i.error.$TIME1
echo "$i$MESSAGE_RECOVERY"|$MAILX_BIN -v -s "$MAILX_OK_TITLE" $CONTACTS_LIST
fi
else
echo "$i$MESSAGE_ERR" >>$LOG_DIR/$LOG_FILE_NAME.$i.error.$TIME1
ERR_COUNTS=`wc -l $LOG_DIR/$LOG_FILE_NAME.$i.error.$TIME1|awk '{print $1}'`
if [[ $ERR_COUNTS -le 3 ]];then
echo "$i$MESSAGE_ERR"|$MAILX_BIN -v -s "$MAILX_ERR_TITLE" $CONTACTS_LIST
else
echo "$(date)|当前端口发邮件次数超出限制的3次停止发送邮件" >>$LOG_DIR/$LOG_FILE_NAME.$i.error.$TIME1
fi
fi
done
fi
sleep 30
/bin/rm -rf $LOG_DIR/$LOG_FILE_NAME.ok.$TIME2 >/dev/null 2>&1 &
done
}
stop () {
cat $TEMDIR/$PID_FILE|xargs kill -9 >/dev/null 2>&1 &
}
status () {
if [[ -e $TEMDIR/$PID_FILE ]];then
echo "服务已经运行,进程ID为:`cat $TEMDIR/$PID_FILE`"
else
echo "服务没有启动"
fi
exit 0
}
case $1 in
start)
if [[ -e $TEMDIR/$PID_FILE ]];then
if [[ -s $TEMDIR/$PID_FILE ]];then
echo "进程PID文件已存在."
else
echo "启动端口检测服务"
/usr/bin/xhattr -i $TEMDIR/$PID_FILE
start &
echo $! >$TEMDIR/$PID_FILE
/usr/bin/xhattr +i $TEMDIR/$PID_FILE
echo "当前启动进程ID:`cat $TEMDIR/$PID_FILE`"
fi
else
echo "启动端口检测服务"
start &
echo $! >$TEMDIR/$PID_FILE
/usr/bin/xhattr +i $TEMDIR/$PID_FILE
echo "当前启动进程ID:`cat $TEMDIR/$PID_FILE`"
fi
;;
stop)
if [[ -e $TEMDIR/$PID_FILE ]];then
if [[ -s $TEMDIR/$PID_FILE ]];then
echo "停止端口检测服务"
stop
/usr/bin/xhattr -i $TEMDIR/$PID_FILE
/bin/rm -rf $TEMDIR/$PID_FILE
else
echo "当前PID文件没有需要停止的进程"
fi
else
echo "进程PID文件不存在"
fi
;;
status)
status
;;
*)
echo "请使用$0 start|stop 的方式启停服务."
esac
2.创建联系人文件contacts_list,每行一个联系人的方式天加邮件联系人名单
3.创建端口文件port_list,写入要监控的端口,每行一个端口
4.启动脚本测试,如果端口异常将会及时发邮件提醒邮件联系人,异常次数达到3此将会停止发送邮件,当端口恢复的时候将发送端口恢复正常的消息到联系人
|
|
|
|
|
|
|