logrotate 如何处理打开的文件?logrotate 可以旋转进程已打开的文件吗?
答案1
对于那些不接受来自 logrotate 的信号的应用程序(正如 Rory 所描述的),我使用了几种方法。
- 使用 copytruncate 选项
- 添加 post-rotate 语句以重启服务
使用哪一个取决于日志文件的大小和无缝日志的必要性。这将是您自己进行的风险分析。但是,举个例子,我在某些日志上使用后旋转重启,而实际上我应该使用 copytruncate。但是,文件通常有几 GB,复制可能需要很长时间,因此每晚损失一两秒是更好的选择。
答案2
看起来我可能想要以下内容,但仍然对任何人关于该主题的专业知识感兴趣:
copytruncate
Truncate the original log file to zero size in place after cre‐
ating a copy, instead of moving the old log file and optionally
creating a new one.
答案3
logrotate 将向进程发送正确的信号,告诉它重新打开日志文件。它对于 apache 或 mysql 等系统而言是开箱即用的。
您可以在 apache 的 postrotate 脚本中看到这一点。如果您有自己的守护进程,并且希望 logrotate 与其一起工作,那么请确保它监听某个信号并重新打开日志文件。
如果您无法更改程序,那么您可以查看守护进程是否有办法自动刷新日志。或者添加一个停止服务器的预旋转和一个重新启动服务器的后旋转。