sharedscripts确保同一配置块内所有日志文件轮转后仅执行一次postrotate脚本,避免重复重载服务;需配合路径通配、服务状态检查及USR1信号安全重启Nginx。

用 sharedscripts 配合 postrotate,能让多个日志路径在一次轮转中只触发一次服务重载(如 kill -USR1 或 systemctl reload),避免每个文件都单独发信号,既减少进程抖动,也防止服务误判或重复加载配置。
sharedscripts 的作用机制
默认情况下,logrotate 对匹配到的每个日志文件都会独立执行一遍 postrotate 脚本。比如你写了:
/var/log/nginx/access.log<br>/var/log/nginx/error.log {<br> daily<br> rotate 7<br> compress<br> postrotate<br> systemctl reload nginx<br> endscript<br>}
那它会先 reload 一次 nginx 处理 access.log,再 reload 一次处理 error.log —— 实际上两次 reload 是冗余的,且可能造成短暂请求失败。
sharedscripts 的意义在于:把整个花括号块内所有匹配路径视为一个“批次”,等全部日志切割、压缩、归档完成之后,统一执行一次 postrotate。
正确写法:多路径 + sharedscripts + 安全判断
以下是一个生产可用的 Nginx 日志轮转配置示例(保存为 /etc/logrotate.d/nginx):
/var/log/nginx/*.log {<br> daily<br> missingok<br> rotate 30<br> compress<br> delaycompress<br> sharedscripts<br> postrotate<br> if systemctl is-active --quiet nginx; then<br> systemctl kill --signal=USR1 nginx 2>/dev/null || true<br> fi<br> endscript<br>}
-
/var/log/nginx/*.log同时覆盖 access.log、error.log 等所有日志文件 -
sharedscripts确保无论匹配几个 .log 文件,只执行一次 USR1 信号 -
systemctl is-active --quiet避免服务未运行时报错中断 -
systemctl kill --signal=USR1比reload更轻量,Nginx 原生支持该信号安全重开日志文件
常见陷阱与绕过方案
某些旧版 Nginx 或自定义部署未使用 systemd,需适配 PID 方式:
postrotate<br> if [ -f /var/run/nginx.pid ]; then<br> kill -USR1 $(cat /var/run/nginx.pid) 2>/dev/null || true<br> fi<br>endscript
- 务必加
if [ -f ... ]判断,否则 logrotate 在无 pid 文件时会报错退出 - 不要用
nginx -s reopen:它依赖当前工作目录和配置路径,不如 USR1 信号稳定 - 若服务本身不支持 USR1(如部分 Java 应用),可改用
systemctl restart,但注意业务中断风险
验证是否生效
手动触发并观察输出:
sudo logrotate -d /etc/logrotate.d/nginx
调试模式下你会看到类似提示:
running postrotate script<br>running shared postrotate script
如果看到多次 “running postrotate script”,说明 sharedscripts 没起作用——检查是否漏写、是否被其他配置覆盖、或路径未真正匹配到多个文件。


















