日系轮替 本文共有3700个字,关键词: ``` #!/bin/bash #Version:0.0.1 #Author:stone #Discription:httpd logrotate. #日志的轮替不借助cron天计划任务 #思路,单独写一个脚本检测当昨天的日志是否轮替,将轮替的日期写入一个文件,通过grep去过滤当天的日期. #如果过滤不到天的日期则进行轮替操作,并且将时间记录到指定文件,死循环中使用sleep,每小时检测一次。 while :; do [ -e /tmp/httpd.date.txt ] || touch /tmp/httpd.date.txt DATE_YEAR=$(date -d "yesterday" "+%Y") #获取昨天的年份 DATE_MON=$(date -d "yesterday" "+%m") #获取昨天的月份 DATE_DAY=$(date -d "yesterday" "+%F") #获取昨天的日期 LOGDIR='/var/log/httpd' #日志的目录 LOGFILE='access_log' #日志的名称 DATE_YEST=$(date -d "yesterday" "+%F") #获取昨天的格式日期,用户判断日志是否轮替 YEST_VALUE=$(grep "$DATE_YEST" /tmp/httpd.date.txt) #提取之前是否轮替过日志 #判断日志是否轮替 if [ -f $LOGDIR/$LOGFILE ]; then if [ "$YEST_VALUE" != "0" ]; then mv ${LOGDIR}/${LOGFILE} ${LOGDIR}/${LOGFILE}_${DATE_YEST} #日志改名(轮替) touch ${LOGDIR}/${LOGFILE} #创建新的日志文件 echo "${LOGDIR}/${LOGFILE}轮替日志为${DATE_YEST}的日志" >>/tmp/httpd.date.txt #轮替完成打上标签 else echo "$(date) 检测完成,日志已经完成轮替" >> /tmp/logrecoed.log #检测日志是否经过轮替 fi else echo "$(date) 检测发现日志不存在,并新创建了日志。" >> ./tmp/logrecoed.log #日志文件不存在时创建日志 touch $LOGDIR/$LOGFILE fi #判断日志是否切割 if [ -f ${LOGDIR}/${LOGFILE}_${DATE_YEST} ]; then [ -d ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY} ] || mkdir -p ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY} SIZE=$(du -h ${LOGDIR}/${LOGFILE}_${DATE_YEST} |awk -F " " '{print $1}') #取日志的大小(真实大小) UNIT=$(echo $SIZE |awk -F "[[:digit:]]" '{print $NF}') #取日志大小的单位 VALUE=$(echo $SIZE |awk -F "K|M|G" '{print $1}') #取日志大小的数值 JUDGE=$(echo "$VALUE>10" |bc) #判断日志大小(仅数值判断),单位的判断放在if语句中 if [ "$JUDGE" == "1" -a "$UNIT" == "M" ]; then #判断轮替日志的大小,满足大于10M时切割 #文件的切割 split -l 50000 ${LOGDIR}/${LOGFILE}_${DATE_YEST} -d -a 3 ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY}/${LOGFILE}_${DATE_YEST}_ #切割完成后删除文件并将操作记录的文件中 [ "$?" == "0" ] && rm -f ${LOGDIR}/${LOGFILE}_${DATE_YEST}; echo "${LOGDIR}/${LOGFILE}_${DATE_YEST} 于$(date "+%F-%R")切割完成">> /tmp/logrecord.log elif [ "$JUDGE" == "1" -a "$UNIT" == "G" ]; then #文件的切割 split -l 50000 ${LOGDIR}/${LOGFILE}_${DATE_YEST} -d -a 3 ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY}/${LOGFILE}_${DATE_YEST}_ #切割完成后删除文件并将操作记录的文件中 [ "$?" == "0" ] && rm -f ${LOGDIR}/${LOGFILE}_${DATE_YEST}; echo "${LOGDIR}/${LOGFILE}_${DATE_YEST} 于$(date "+%F-%R")切割完成">> /tmp/logrecord.log else #如果不足4M直接移动到相应目录下 mv ${LOGDIR}/${LOGFILE}_${DATE_YEST} ${LOGDIR}/${DATE_YEAR}/${DATE_MON}/${DATE_DAY}/${LOGFILE}_${DATE_YEST} [ "$?" == "0" ] && echo "${LOGDIR}/${LOGFILE}_${DATE_YEST} 于$(date "+%F-%R")切割完成" >> /tmp/logrecord.log fi else echo "$(date) 执行了一次脚本" >>/tmp/logrecord.log #每正确执行一次该循环向文件中输入 fi sleep 1h #睡她一小时 done ``` 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 几人行 (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 shell脚本 2017-03-17 评论 1790 次浏览