当前位置 博文首页 > JustinQin:nginx--基于crond定时服务+shell脚本实现nginx日志自

    JustinQin:nginx--基于crond定时服务+shell脚本实现nginx日志自

    作者:[db:作者] 时间:2021-09-12 08:59

    一、学习背景

    • 大家都用过nginx,关于nginx日志自动清理自动分割备份压缩,方案有很多
    • 但是不论哪一种,核心原理都是使用kill -USR1 + nginx的PID进程文件来实现
    • 本文主要介绍自定义shell脚本+ crond定时任务实现。

    二、shell脚本

    2.1、脚本实现思路

    • 定义日志要保存的天数SAVE_DAYS=7
    • 重命名当天日志 mv ***.log ***_日期.log
    • 重新打开nginx日志文件kill -USR1 nginx的PID进程文件
    • 压缩已备份日志(节省空间)gzip ***_日期.log
    • 清理保存天数之前的日志find 路径 -type f -mtime +几天前 | xargs rm -f

    2.2、完整脚本

    clearNginxLog.sh

    #!/bin/sh
    #Command:/usr/nginx/nginx/tools/clearNginxLog.sh
    #Execute time: 00:00:00
    LOGS_PATH=/usr/nginx/logs/nginx
    
    #nginx pid path
    PID=/usr/nginx/nginx/nginx.pid
    
    #nginx logs save days
    SAVE_DAYS=7
    
    #backup data format
    TODAY=$(date -d 'today' +%Y-%m-%d)
    CURRENTTIME=$(date -d 'today' +%Y-%m-%d-%H-%M-%S)
    
    logfile=$LOGS_PATH/clearNginxLog_${TODAY}.log
    
    echo "`date +%Y-%m-%d` `date +%H-%M-%S` Start run the shell $0." >> ${logfile}
    echo "Security check start." >> ${logfile}
    if [ $LOGS_PATH == "/" ] || [ $LOGS_PATH == "/etc" ] || [ $LOGS_PATH == "/opt" ] || [ $LOGS_PATH == "/usr" ];then
      echo "Nginx logs path is not right!!!" >> ${logfile}
      exit 1;
    fi
    
    if [ -z "$LOGS_PATH" ];then
      echo "Nginx logs path is null!!!" >> ${logfile} 
      exit 1;
    fi
    
    if [ -z "$SAVE_DAYS" ];then
      SAVE_DAYS=7
    fi
    echo "Security check success." >> ${logfile}
    
    echo "Move and rename logs start."
    if [ -f ${LOGS_PATH}/error_${TODAY}.log.gz ];then
      TODAY=$CURRENTTIME
    fi
    
    if [ -f ${LOGS_PATH}/access_${TODAY}.log.gz ];then
      TODAY=$CURRENTTIME
    fi
    
    if [ -f ${LOGS_PATH}/host.access_${TODAY}.log.gz ];then
      TODAY=$CURRENTTIME
    fi
    echo "Move and rename logs finished."
    
    #bak log files
    mv ${LOGS_PATH}/host.access.log ${LOGS_PATH}/host.access_${TODAY}.log
    mv ${LOGS_PATH}/error.log ${LOGS_PATH}/error_${TODAY}.log
    mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${TODAY}.log
    
    #RESTART nginx process open file pid
    kill -USR1 `cat ${PID}`
    
    #Compress xxx.log to xxx.log.gz and auto remove xxx.log
    if [ -f "/usr/bin/gzip" ];then
      gzip ${LOGS_PATH}/host.access_${TODAY}.log
      gzip ${LOGS_PATH}/error_${TODAY}.log
      gzip ${LOGS_PATH}/access_${TODAY}.log
    fi
    echo "Move and rename logs success." >> ${logfile}
    
    echo "Command: find ${LOGS_PATH} -type f -mtime +{SAVE_DAYS} | xargs rm -f" >> ${logfile}
    echo "clear files:" >> ${logfile}
    find ${LOGS_PATH} -type f -mtime +${SAVE_DAYS} -print >> ${logfile}
    find ${LOGS_PATH} -type f -mtime +${SAVE_DAYS} | xargs rm -f
    
    echo "`date +%Y-%m-%d` `date +%H-%M-%S` End run the shell $0." >> ${logfile}
    exit 0
    
    

    3.1 上传shell脚本

    • 创建脚本存放目录mkdir -p /usr/nginx/nginx/tools/
    • 将shell脚本clearNginxLog.sh上传到Linux服务器的/usr/nginx/nginx/tools/目录下

    3.2 手动验证shell脚本

    • 进入脚本存放目录cd /usr/nginx/nginx/tools/
    • 手动执行shell脚本sh clearNginxLog.sh
      在这里插入图片描述
      在这里插入图片描述

    三、crond定时任务

    3.3 crond定时服务

    • 定时任务的作用是定时的去执行自定义好的clearNginxLog.sh脚本
    • Linux定时执行脚本的方式有很多,这里使用crond服务来实现定时任务
    • crond是Linux操作系统自带的定时服务,自带守护进程,一般用于运行计划任务如系统备份、日志分割及清理。
    • crond服务适合在那些24x7不间断运行的机器如服务器上运行的计划任务。

    3.4 配置crond任务

    • crond表达式
      示例1:0 0 * * * 每天整点执行
      示例2:*/1 0 * * * 每隔一分钟执行
      –参数说明
      crond表达式从左右分别表示分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天)

    • 验证crond配置
      配置当前用户crond的执行命令/usr/bin/crontab -e
      修改指令内容为如下command指令,表示每分钟执行脚本,验证crond定时任务是否正常:
      */1 * * * * /bin/sh /usr/nginx/nginx/tools/clearNginxLog.sh

    • 实时查看cron执行日志(这里只有root用户有权限查看~)
      tail -f /var/log/cron
      在这里插入图片描述

    • 修改crond定时任务为每日整点执行
      0 0 * * * /bin/sh /home/nginx/tools/clearNginxLog.sh

    cs