https://yq.aliyun.com/ziliao/106027
https://yq.aliyun.com/ziliao/65927?spm=a2c4e.11155472.blogcont.23.7fe76988W6oBo9
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腳本檢測端口,以便於您獲取更多的相關知識。