sharedscripts仅在同一配置块内生效,确保多路径日志共用单次postrotate:须将所有日志路径写入同一files段并声明sharedscripts,跨独立配置块无效。

Logrotate 的 sharedscripts 是为解决“多个日志文件共用同一服务重载逻辑”而设计的,但它的生效前提常被误解:它**只对同一个 logrotate 配置块(即同一组 files 匹配项)内的所有日志路径有效**,而非跨多个独立配置块。若你有多个日志组(比如分别监控 /var/log/app1/*.log 和 /var/log/app2/*.log),默认情况下它们各自触发自己的 postrotate,即使都写了 sharedscripts,也不会合并执行。
确保 sharedscripts 生效的关键:统一归入一个配置块
Logrotate 判断是否“共享脚本”的依据是——这些日志路径是否由**同一个配置段落(section)声明**。只要它们出现在同一组 files 或通配路径下,并共用 sharedscripts,那么所有匹配到的日志在本次轮转中,无论数量多少、是否实际被切割,postrotate 和 endscript 之间内容**仅执行一次**。
- ✅ 正确写法(单配置块 + sharedscripts):
/var/log/app1/*.log /var/log/app2/*.log {
daily
missingok
rotate 7
compress
sharedscripts
postrotate
systemctl reload myapp.service > /dev/null 2>&1 || true
endscript
}这样,哪怕 app1 有 3 个日志、app2 有 5 个日志,只要本轮有任一文件满足轮转条件,postrotate 就只运行一次。
避免常见误用:多个独立配置块不共享脚本
以下写法看似合理,实则无效——每个块独立判断、独立执行 postrotate:
# ❌ 错误:两个分离的块,sharedscripts 各自作用域内有效,但彼此无关
/var/log/app1/*.log {
daily
sharedscripts
postrotate
systemctl reload myapp.service
endscript
}
<p>/var/log/app2/*.log {
daily
sharedscripts
postrotate
systemctl reload myapp.service
endscript
}</p>结果:若 app1 的 2 个日志和 app2 的 1 个日志都被轮转,systemctl reload 会执行 2 次(每块一次)。这不是 sharedscripts 的设计目标。
进阶技巧:用 include + 公共变量简化多路径管理
当路径分散或需复用逻辑时,可借助 include 和外部定义(如 shell 变量)提升可维护性,但仍须保证最终落在同一配置块内:
- 在
/etc/logrotate.d/myapp中写:
# 使用通配包含所有子目录日志,保持单块结构
/var/log/app*/**/*.log {
daily
missingok
rotate 7
compress
sharedscripts
postrotate
# 统一 reload,且只一次
systemctl reload myapp.service 2>/dev/null || :
endscript
}注意:** 需 logrotate ≥ 3.18.0 且启用 globstar(部分发行版默认支持);若不支持,改用显式空格分隔路径或生成配置脚本预处理。
验证 sharedscripts 是否真正生效
手动触发并观察输出:
- 加
-d(debug)模式查看执行计划:logrotate -d /etc/logrotate.d/myapp,确认 “running postrotate script” 只出现一次; - 加
-v(verbose)配合真实轮转:logrotate -vf /etc/logrotate.d/myapp,检查终端输出和系统日志(journalctl -u myapp.service)中 reload 记录次数; - 在
postrotate中临时加入日志:echo "$(date) reload triggered" >> /var/log/logrotate-debug.log,确认文件中对应时间点仅一行新增。











