文件目录结构如下
contacts_list文件
里面是填写你的邮件地址的
global_profile
代码如下 | 复制代码 |
#!/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地址用于邮件触发是区别异常服务器 SERVER_IP="192.168.10.100" TIME=$(date +%Y-%m-%d) LOG_DIR=$BASEDIR/logs MAKE_LOG_FILE=log.$1.$TIME #需要检测或轮询的日志文件列表 LOG_FILE_LIST=$BASEDIR/logs_list #邮件联系人列表文件 MAILX_CONTACTS_LIST=$BASEDIR/contacts_list #mailx发邮件程序的路径 MAILX_BIN=/usr/src/mailx-12.4/mailx #邮件标题内容 MAILX_TITLE="$SERVER_IP日志检测异常提醒" |
logs_list文件内容如下
#日志路径已经日志文件前缀(注意写不包含日期的部分,如果日志有时间的话将最后一列设置为1默认会自动添加日期) 服务名称 间隔时间 查找内容 开启或关闭邮件 打开或关闭日志格式,日志格式为(0表示采用默认指定格式,1表示采用所有格式*-日期、*-日期.log、*_日期、*_日期.log、*.日期、*.日期.log等)
代码如下 | 复制代码 |
/var/log/secure secure 10 failed 1 0 /var/log/log kkk 20 failed 0 1 /var/log/a sss 5 failed 0 1 /var/log/b bbb 5 failed 0 1 |
commands.sh文件如下
代码如下 | 复制代码 |
#!/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"` PID_DIR=/var/run source $BASEDIR/global_profile if [ $# -eq 0 ];then echo "$(date)|请使用startup.sh脚本启动服务,如果需要手动触发该脚本请传递一个服务名称`cat $LOG_FILE_LIST|grep -v "^#"|grep -v "^$"|awk '{print $2}'|xargs`其中一个." exit 0 elif [ $# -eq 1 ];then if [ ! -e $LOG_FILE_LIST ]||[ ! -s $LOG_FILE_LIST ];then echo "$(date)|当前日志文件列表($LOG_FILE_LIST)不存在或者为空,检测失败,程序退出." exit 0 else WC_LOG_FILE_LIST=`cat $LOG_FILE_LIST|awk '{print $2}'|egrep -o $1|wc -l` if [ $WC_LOG_FILE_LIST -eq 0 ];then echo "$(date)|请传递指定列表`cat $LOG_FILE_LIST|awk '{print $2}'|xargs`的日志服务名称." exit 0 fi fi else echo "$(date)|这里只接受传递一级参数服务名称,请确认后重新传." exit 0 fi while 1>0;do if [ ! -e $BASEDIR/global_profile ]||[ ! -s $BASEDIR/global_profile ];then echo "$(date)|当前变量文件($BASEDIR/global_profile)不存在或者为空,程序异常退出." break else source $BASEDIR/global_profile TIME=$(date +%Y-%m-%d) TIME1=$(date +%Y%m%d) LOG_DIR=$BASEDIR/logs MAKE_LOG_FILE=log.$1.$TIME if [ ! -e $LOG_DIR ];then mkdir -p $LOG_DIR fi if [ -e $LOG_FILE_LIST ];then if [ -s $LOG_FILE_LIST ];then SLEEP_TIME=`grep "$1" $LOG_FILE_LIST|awk '{print $3}'|grep -v "^#"|grep -v "^$"` GREP_CONTENTS=`grep "$1" $LOG_FILE_LIST|awk '{print $4}'|grep -v "^#"|grep -v "^$"` OPEN_CLOSE_SEND_MAIL=`grep "$1" $LOG_FILE_LIST|awk '{print $5}'|grep -v "^#"|grep -v "^$"` OPEN_CLOSE_LOGS_DAY=`grep "$1" $LOG_FILE_LIST|awk '{print $6}'|grep -v "^#"|grep -v "^$"` if [ $OPEN_CLOSE_LOGS_DAY -eq 0 ];then CHECK_LOG_FILE=`grep "$1" $LOG_FILE_LIST|awk '{print $1}'|grep -v "^#"|grep -v "^$"` elif [ $OPEN_CLOSE_LOGS_DAY -eq 1 ];then TEMP_CHECK_LOG_FILE=`grep "$1" $LOG_FILE_LIST|awk '{print $1}'|grep -v "^#"|grep -v "^$"` #以下是匹配所有日志格式的语句 if [ -e ${TEMP_CHECK_LOG_FILE}.${TIME} ];then CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}.${TIME} elif [ -e ${TEMP_CHECK_LOG_FILE}-${TIME} ];then CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}-${TIME} elif [ -e ${TEMP_CHECK_LOG_FILE}_${TIME} ];then CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}_${TIME} elif [ -e ${TEMP_CHECK_LOG_FILE}.${TIME}.log ];then CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}.${TIME}.log elif [ -e ${TEMP_CHECK_LOG_FILE}-${TIME}.log ];then CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}-${TIME}.log elif [ -e ${TEMP_CHECK_LOG_FILE}_${TIME}.log ];then CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}_${TIME}.log elif [ -e ${TEMP_CHECK_LOG_FILE}.${TIME1} ];then CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}.${TIME1} elif [ -e ${TEMP_CHECK_LOG_FILE}-${TIME1} ];then CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}-${TIME1} elif [ -e ${TEMP_CHECK_LOG_FILE}_${TIME1} ];then CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}_${TIME1} elif [ -e ${TEMP_CHECK_LOG_FILE}.${TIME1}.log ];then CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}.${TIME1}.log elif [ -e ${TEMP_CHECK_LOG_FILE}-${TIME1}.log ];then CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}-${TIME1}.log elif [ -e ${TEMP_CHECK_LOG_FILE}_${TIME1}.log ];then CHECK_LOG_FILE=${TEMP_CHECK_LOG_FILE}_${TIME1}.log else echo "$(date)|未知的日志格式."|tee -a $LOG_DIR/$MAKE_LOG_FILE fi else echo "$(date)|当前传递参数错误,请传递0或者1(0表示使用当前日志查找或者1自动添加当前日期查找)"|tee -a $LOG_DIR/$MAKE_LOG_FILE fi WC_COUNT_LOG_START=`wc -l $CHECK_LOG_FILE|awk '{print $1}'` sleep $SLEEP_TIME WC_COUNT_LOG_START1=`wc -l $CHECK_LOG_FILE|awk '{print $1}'` WC_UPDATE_LOG_FILE=`expr $WC_COUNT_LOG_START1 - $WC_COUNT_LOG_START` if [ $WC_UPDATE_LOG_FILE -eq 0 ];then echo "$(date)|当前检测日志($CHECK_LOG_FILE)没有日志更新." >>$LOG_DIR/$MAKE_LOG_FILE else WC_GREP_COUNTS=`tail -"$WC_UPDATE_LOG_FILE" "$CHECK_LOG_FILE"|grep "$GREP_CONTENTS"|wc -l` if [ $WC_GREP_COUNTS -eq 0 ];then echo "$(date)|当前更新的日志($CHECK_LOG_FILE)没有发现指定查找内容($GREP_CONTENTS)." >>$LOG_DIR/$MAKE_LOG_FILE else if [ $OPEN_CLOSE_SEND_MAIL -eq 1 ];then if [ -e $MAILX_CONTACTS_LIST ];then if [ -s $MAILX_CONTACTS_LIST ];then echo "当前日志($CHECK_LOG_FILE)检测到指定查找内容($GREP_CONTENTS)."|$MAILX_BIN -s "$MAILX_TITLE" `cat $MAILX_CONTACTS_LIST|grep -v "^#"|grep -v "^$"|xargs` echo "$(date)|当前日志($CHECK_LOG_FILE)检测到指定查找内容($GREP_CONTENTS),已触发邮件通知`cat $MAILX_CONTACTS_LIST|grep -v "^#"|grep -v "^$"|xargs`." else echo "$(date)|当前日志($CHECK_LOG_FILE)检测到指定查找内容($GREP_CONTENTS),邮件联系人列表文件($MAILX_CONTACTS_LIST)为空,触发邮件失败." >>$LOG_DIR/$MAKE_LOG_FILE fi else echo "$(date)|当前日志($CHECK_LOG_FILE)检测到指定查找内容($GREP_CONTENTS),联系人列表文件($MAILX_CONTACTS_LIST)不存在,触发邮件失败." >>$LOG_DIR/$MAKE_LOG_FILE fi else echo "$(date)|当前日志($CHECK_LOG_FILE)检测到指定查找内容($GREP_CONTENTS),当前设置为禁止发送邮件." >>$LOG_DIR/$MAKE_LOG_FILE fi fi fi else |
startup.sh文件如下所示
代码如下 | 复制代码 |
#!/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"` PID_DIR=/var/run #用于检测全局变量文件是否存在或者为空,如果不存在或为空则退出程序 if [ ! -e $BASEDIR/global_profile ]||[ ! -s $BASEDIR/global_profile ];then echo "$(date)|当前全局变量文件($BASEDIR/global_profile)不存在或者没有内容,检测失败,程序退出." exit 0 else source $BASEDIR/global_profile fi #用于检测日志列表文件是否存在或为空,如果不存在或者为空则退出程序 if [ ! -e $LOG_FILE_LIST ]||[ ! -s $LOG_FILE_LIST ];then echo "$(date)|当前日志文件列表($LOG_FILE_LIST)不存在或者为空,检测失败,程序退出." exit 0 else WC_LOG_FILE_LIST=`cat $LOG_FILE_LIST|awk '{print $2}'|egrep -o $1|wc -l` if [ $WC_LOG_FILE_LIST -eq 0 ];then echo "$(date)|请传递指定列表`cat $LOG_FILE_LIST|awk '{print $2}'|xargs`的日志服务名称." exit 0 else if [ $# -eq 1 ];then if [ -e $PID_DIR/$1.pid ];then echo "$(date)|当前进程PID文件($PID_DIR/$1.pid)已经存在,启动服务失败." exit 0 else $BASEDIR/commands.sh $1 & echo $! >$PID_DIR/$1.pid echo "$(date)|当前启动进程ID为`cat $PID_DIR/$1.pid`" fi elif [ $# -eq 2 ];then if [ -e $PID_DIR/$1.pid ];then if [ -s $PID_DIR/$1.pid ];then if [ $2 == 'start' ];then echo "$(date)|进程PID文件($PID_DIR/$1.pid)已存在再次启动失败." exit 0 elif [ $2 == 'stop' ];then echo "$(date)|正在停止($1)服务,当前停止进程为`cat $PID_DIR/$1.pid`" cat $PID_DIR/$1.pid|xargs kill -9 &>/dev/null /bin/rm -f $PID_DIR/$1.pid &>/dev/null elif [ $2 == 'status' ];then echo "$(date)|服务($1)正在运行,当前进程ID为`cat $PID_DIR/$1.pid`" else echo "$(date)|请使用传递服务名称$1 start|stop|status来启动停止或查看服务状态." exit 0 fi else if [ $2 == 'start' ];then echo "$(date)|进程PID文件($PID_DIR/$1.pid)已存但是为空在再次启动失败." exit 0 elif [ $2 == 'stop' ];then echo "$(date)|当前进程PID文件为空,停止进程失败." exit 0 elif [ $2 == 'status' ];then echo "$(date)|当前进程PID文件为空,无法获知服务状态." exit 0 else echo "$(date)|请使用传递服务名称$1 start|stop|status来启动停止或查看服务状态." exit 0 fi fi else if [ $2 == 'start' ];then $BASEDIR/commands.sh $1 & echo $! >$PID_DIR/$1.pid echo "$(date)|当前启动进程ID为`cat $PID_DIR/$1.pid`" elif [ $2 == 'stop' ];then echo "$(date)|当前进程PID文件($PID_DIR/$1.pid)不存在,停止服务失败." exit 0 elif [ $2 == 'status' ];then echo "$(date)|当前服务($1)未启动运行." exit 0 else echo "$(date)|请使用传递服务名称$1 start|stop|status来启动停止或查看服务状态." exit 0 fi fi else echo "$(date)|请使用传递服务名称$1 start|stop|status来启动停止或查看服务状态." exit 0 fi fi fi |
时间: 2024-10-02 06:01:02