为什么我的 CentOS logrotate 在随机时间运行?

为什么我的 CentOS logrotate 在随机时间运行?

我放入logrotate了一个配置文件/etc/logrotate.d/并期望日志在一致的时间轮换;然而,事实并非如此......日志轮换时间似乎是随机的+/-一小时。

为什么日志轮换开始时间是随机的,我该如何改变这种情况?


信息:我的 logrotate 配置文件如下所示...

/opt/backups/network/*.conf {
        copytruncate
        rotate 30
        daily
        create 644 root root
        dateext
        maxage 30
        missingok
        notifempty
        compress
        delaycompress
        postrotate
            ## Create symbolic links in daily/
            PATH=`/usr/bin/dirname $1`;
            FILE=`/bin/basename $1`;
            /bin/ln -s $1 $PATH/daily/$FILE
        endscript
}

答案1

关键是要知道 CentOS 从anacron...运行 /etc/cron.{daily,weekly,monthly} 中的脚本/etc/anacrontab正在设置,它会执行您所期望的操作(它会在开始工作之前RANDOM_DELAY延迟几分钟)...RANDOM_DELAY

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

设置RANDOM_DELAY=0/START_HOURS_RANGE=3修复问题...

编辑

经过进一步思考,我准备删除anacron并安装正常的 vixie cron...

答案2

这不是答案,但最近我因为其他原因试图弄清楚这一点,但找不到有关 Redhat 6、Centos 等如何运行 cron 的任何文档。以下是我逆向工程的结果:

  1. crond仍在系统启动时运行 - 它会加载所有文件/etc/cron.d
  2. /etc/cron.d/0hourly运行所有文件/etc/cron.hourly
  3. /etc/cron.hourly/0anacron运行anacron
  4. anacron 加载/etc/anacrontab
  5. /etc/anacrontab运行(通过run-parts/etc/cron.daily/etc/cron.weekly并且/etc/cron.monthly

因此,它比以前的版本更加复杂。

可以通过将每小时、每周和每月条目重新添加到/etc/crontab(现在为空)来恢复旧行为,但anacrontab也需要更新。这可能会或可能不会破坏未来的更新...

答案3

其他答案涵盖如何但不一定为什么。 这原因是为了防止同时进行的夜间 cron 任务破坏您的基础设施。(想象一下共享存储,或者可能在一台 VM 主机上运行的 1000 台服务器,或者只是影响某些网络服务的夜间任务。)

我总是通过将特定日志轮换作业从 移动cron.daily到具有硬编码时间的条目来解决系统上特定日志轮换的这个问题cron.d。这样,您仍然可以获得像 updatedb 这样的服务的交错运行,其中时间实际上并不重要,但日志轮换的时间是一致的。

当然,当达到一定规模时,无论如何你都会希望将所有日志从主机发送到日志服务器,然后各个节点上的文件轮换时间就不那么重要了,因为它们只是为了方便(通常跟在文件末尾)或作为最后的后备手段。然后,你会确实将日志服务器上的轮换设置为系统性的。

相关内容