Logrotate 轮转后执行自定义脚本需用 postrotate 指令,支持直接写命令或调用独立脚本;注意以 endscript 结尾、脚本需可执行且含 shebang;$1 不可用,需手动获取轮转文件;务必用 logrotate -d 和 -f 测试验证。

在 Logrotate 轮转日志后执行自定义脚本,主要通过 postrotate 指令实现。它会在日志完成轮转(重命名、压缩、删除等操作)之后运行指定命令或脚本。
使用 postrotate 执行简单命令
直接在 logrotate 配置块中写入 shell 命令即可,注意必须以 endscript 结尾:
/var/log/myapp/*.log {
daily
missingok
rotate 7
compress
postrotate
systemctl reload myapp.service
endscript
}上面配置每天轮转 /var/log/myapp/ 下的日志,并在轮转完成后重载服务。
调用外部脚本更灵活可靠
复杂逻辑建议封装成独立脚本(如 /usr/local/bin/logrotate-myapp-hook.sh),再在配置中调用:
- 确保脚本有可执行权限:
chmod +x /usr/local/bin/logrotate-myapp-hook.sh - 脚本开头加上
#!/bin/bash,避免 shell 兼容问题 - 在 logrotate 配置中这样写:
postrotate
/usr/local/bin/logrotate-myapp-hook.sh
endscript注意变量和上下文限制
logrotate 在 postrotate 中不自动导出轮转文件路径等变量,如需访问最新轮转后的文件名,得手动构造或借助环境判断:
-
$1在postrotate中不可用(仅prerotate支持参数) - 若需处理刚生成的压缩包,可用
ls -t /var/log/myapp/*.log.* | head -n1获取最新一个 - 避免在脚本中依赖交互式终端或未定义的环境变量(logrotate 默认以 root 运行,但环境精简)
验证与调试技巧
配置修改后务必测试,防止语法错误导致轮转失败:
- 检查语法:
logrotate -d /etc/logrotate.d/myapp(-d 表示 debug 模式) - 强制触发一次轮转并观察行为:
logrotate -f /etc/logrotate.d/myapp - 查看系统日志确认是否执行成功:
journalctl -u logrotate --since "1 hour ago"或查/var/log/messages


















