You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CentOS 8中logrotate通过Cron自动执行时无法轮转Nginx日志,但手动执行正常

CentOS 8中logrotate通过Cron自动执行时无法轮转Nginx日志,但手动执行正常

遇到这种情况确实挺头疼的——明明手动跑logrotate -v /etc/logrotate.conf能正常轮转日志,Cron日志也显示任务执行完成,甚至/var/lib/logrotate/logrotate.status都更新了,但实际Nginx日志就是没轮转。结合CentOS 8的环境特性,给你几个实用的排查方向:

1. 排查Cron环境变量差异

手动执行时你是在自己的shell环境下(比如root的bash),但Cron的默认环境变量非常有限,可能缺少必要的路径或者配置:

  • 你的Nginx logrotate配置里如果用了nginx -s reload这种相对路径命令,Cron可能找不到nginx的执行文件。建议改成绝对路径,先用which nginx找到路径(一般是/usr/sbin/nginx),然后把配置里的命令改成/usr/sbin/nginx -s reload。
  • 可以给Cron里的logrotate任务加日志输出,方便排查错误:修改/etc/cron.daily/logrotate脚本,把执行logrotate的那一行改成:
    /usr/sbin/logrotate /etc/logrotate.conf >> /var/log/logrotate_cron.log 2>&1
    
    等下一次Cron执行后,查看/var/log/logrotate_cron.log,看看有没有报错或者异常输出。

2. 检查SELinux上下文与权限问题

CentOS 8默认启用SELinux,有时候会阻止Cron执行的logrotate进行某些操作(比如访问Nginx日志文件、执行reload命令),而手动执行时因为shell的SELinux上下文不同,不会触发限制:

  • 可以先临时关闭SELinux测试:执行setenforce 0,然后等下一次Cron任务执行,看日志是否正常轮转。如果正常,那就是SELinux的问题,需要用audit2allow工具生成对应的策略模块来放行。
  • 同时检查Nginx日志文件、logrotate配置文件的权限,确保root用户(Cron默认以root执行)拥有读写权限,避免权限不足导致无法操作日志。

3. 确认logrotate轮转条件是否真的满足

有时候logrotate.status更新了,但logrotate内部判断当前日志还没达到轮转条件——比如你配置了size 100M但日志还没到大小,或者daily但日志的最后修改时间还没到下一天:

  • 先查看Nginx的logrotate配置(一般在/etc/logrotate.d/nginx),确认轮转规则(比如daily、size、rotate等参数)。
  • 对比Cron执行的时间(从/var/log/cron里的时间)和日志文件的最后修改时间、大小,看是否真的满足轮转条件。另外可以把手动执行logrotate -v /etc/logrotate.conf的详细输出保存下来,和Cron执行时的日志(之前添加的logrotate_cron.log)对比,看logrotate的判断逻辑有没有差异。

4. 检查Anacron的执行逻辑

从你的Cron日志可以看到,是Anacron在执行cron.daily的任务,Anacron本身会有延迟执行的机制,可能导致任务执行时的时间点不满足轮转条件,或者执行环境有差异:

  • 查看/etc/anacrontab配置,确认cron.daily的延迟时间设置,以及执行用户是否为root。
  • 可以尝试直接手动触发Anacron的cron.daily任务:anacron -t /etc/anacrontab -n cron.daily,看执行后日志是否轮转,同时观察输出信息。

备注:内容来源于stack exchange,提问作者Trevor Handermann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 10:19:33