例如:
程序A正在将日志写入文件“ test.log”。
如果运行logrotate,它将首先将“ test.log”重命名为“ test.log.1”,然后创建一个新文件“ test.log”。
在步骤2之后,程序A不会报告任何错误,但是A的日志不会出现在新文件“ test.log”中。
问题是:
步骤2之后A写入文件的数据在哪里?
当另一个进程正在写入文件时,如何logrotate重命名并创建新文件? (关于logrotate我有什么想念的吗?)
谢谢!
答案 0 :(得分:4)
这与POSIX文件系统的工作方式紧密相关。重命名文件时,仅是已更改文件的名称,磁盘上的物理文件不会更改。另外,一旦打开文件,使用该文件的过程只有一个链接(通过多层)到磁盘上的物理文件,该名称仅在打开文件时使用。
这意味着程序A仍将写入同一个文件,该文件现在具有新名称(即示例中的test.log.1
)。
此问题的常见解决方案是让日志旋转程序向该过程发送信号(例如SIGHUP
或SIGUSR1
或类似的信号)。该过程将检测到该信号,然后重新打开日志以使用新文件。