【发布时间】:2012-08-15 20:03:45
【问题描述】:
我有一个生成日志文件的 php 脚本。 另一方面,我有另一个脚本应该每小时运行一次来处理日志文件。
在我的第二个脚本中,我想复制并截断正在写入的日志文件,而不会丢失任何数据。
在一个有限的测试中,我一直在使用重命名来创建副本,我得到了预期的结果
但我担心这种方法的正确性。
这样做安全吗?
【问题讨论】:
我有一个生成日志文件的 php 脚本。 另一方面,我有另一个脚本应该每小时运行一次来处理日志文件。
在我的第二个脚本中,我想复制并截断正在写入的日志文件,而不会丢失任何数据。
在一个有限的测试中,我一直在使用重命名来创建副本,我得到了预期的结果
但我担心这种方法的正确性。
这样做安全吗?
【问题讨论】:
您正在做的事情称为“日志轮换”,是的,通过重命名日志文件来做到这一点是安全的。
在 Linux 中,您可以在另一个应用程序写入文件时重命名文件,并且该应用程序将继续写入重命名的文件。详情请见this SO answer。
在 Windows 中,如果打开文件的应用程序在调用 CreateFile 时设置了 FILE_SHARE_DELETE 标志,则只能重命名打开的文件。如果设置了该标志,它的工作方式与在 Linux 上的工作方式相同(应用程序继续写入重命名的文件)。如果未设置,任何重命名文件的尝试都将失败。
您可能还对logrotate 命令感兴趣。
【讨论】: