#教程# – crontab定时任务执行时间不准确,以及无法精确到秒的解决办法

前言

前段时间安装了goaccess日志统计,分割网站日志时因为crontab 定时任务执行时间不准确,生成的每日统计页面经常有 2 个时间段,这里分享下切割网站日志精确到秒的方法。以便 goacess 日志统计更加准确,还可以配合其他更多脚本使用。

图片[1] - #教程# – crontab定时任务执行时间不准确,以及无法精确到秒的解决办法 - 云线路

日志切割脚本

#!/bin/bash

#set the path to nginx log files
log_files_path="/home/wwwlogs/"
log_files_dir=${log_files_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
#set nginx log files you want to cut
log_files_name=(yunloc.com yunloc-oult)
#set the path to nginx.
nginx_sbin="/usr/local/nginx/sbin/nginx"
#Set how long you want to save
save_days=31

# 获取当前时间的小时、分钟和秒
hour=$(date "+%H")
minute=$(date "+%M")
second=$(date "+%S")

# 判断当前时间是否在指定时间范围内(精确到秒)
if [[ 10#$hour -eq 23 && 10#$minute -eq 59 && 10#$second -eq 59 ]]; then
    # 在指定时间范围内执行任务
    echo "$(date '+%H:%M:%S') Current time is within the designated time range. Executing task..."
    mkdir -p $log_files_dir
    log_files_num=${#log_files_name[@]}
    #cut nginx log files
    for((i=0;i<$log_files_num;i++));do
    mv ${log_files_path}${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d").log
    done
    #delete 30 days ago nginx log files
    find $log_files_path -mtime +$save_days -exec rm -rf {} \; 
    wait
    $nginx_sbin -s reload
    echo "$(date '+%H:%M:%S') complete."
else
    # 不在指定时间范围内
    echo "$(date '+%H:%M:%S') Current time is outside the designated time range. Waiting for specified time..."

    # 循环等待,每秒钟判断一次当前时间是否在指定时间范围内
    while true; do
        # 获取当前时间的小时、分钟和秒
        hour=$(date "+%H")
        minute=$(date "+%M")
        second=$(date "+%S")
        
        # 判断当前时间是否在指定时间范围内(精确到秒)
        if [[ 10#$hour -eq 23 && 10#$minute -eq 59 && 10#$second -eq 59 ]]; then
            # 当前时间在指定时间范围内,执行任务并跳出循环
            echo "$(date '+%H:%M:%S') Current time is within the designated time range. Executing task..."
            mkdir -p $log_files_dir
            log_files_num=${#log_files_name[@]}
            #cut nginx log files
            for((i=0;i<$log_files_num;i++));do
            mv ${log_files_path}${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d").log
            done
            #delete 30 days ago nginx log files
            find $log_files_path -mtime +$save_days -exec rm -rf {} \; 
            wait
            $nginx_sbin -s reload
            echo "$(date '+%H:%M:%S') complete."
            break
        fi
        
        # 等待 1 秒
        sleep 1
    done
fi

此脚本是通过军哥的 LNMP 备份脚本修改而来。

设定定时任务

59 23 * * * /bin/bash /root/cut_nginx_logs.sh

结语

设定为每日 23:59 分执行,脚本会每隔 1 秒检查时间是否为预定时间,如果没到时间就继续检查,直到时间为 23:59:59 才会执行任务。

© 本站文章随意转载,但请注明出处!
THE END
点赞5 分享
评论 抢沙发
头像
务必使用真实的邮箱地址评论,虚假邮箱的评论将不通过审核及无回复。
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容