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的那一行改成:
等下一次Cron执行后,查看/usr/sbin/logrotate /etc/logrotate.conf >> /var/log/logrotate_cron.log 2>&1/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
相关产品推荐
相关产品推荐

