如果日志文件中不断附加事件,那么用另一个进程读取该文件(或复制它)的安全性有多大?
答案 0 :(得分:3)
Unix允许并发读写。读取文件而其他人附加文件是完全安全的。
当然,当阅读行为到达文件末尾时,附加行为未完成,然后此阅读器将获得不完整版本(例如,文件末尾只有新日志条目的一部分) )。但从技术上讲,这是正确的,因为文件在读取时确实处于这种状态(例如复制)。
修改
还有更多内容。
如果编写者进程具有打开的文件句柄,只要此进程保留打开的文件句柄,该文件就会保留在磁盘上。
如果删除文件(rm(1)
,unlink(2)
),它将仅从其目录中删除。它将保留在磁盘上,并且该编写器(以及恰好具有打开文件句柄的所有其他人)仍将能够读取已删除文件的内容。只有在最后一个进程关闭其文件句柄后,才会在磁盘上释放文件内容。
如果进程写入填满磁盘的大型日志文件,则有时会出现问题。如果它保留并打开日志文件的文件句柄,则系统管理员无法使用rm
释放此磁盘容量。
一种典型的方法是杀死该过程。因此,作为一个过程,在写入日志后再次关闭日志文件的文件句柄是一个好主意(或者至少不时地关闭并重新打开它)。
还有更多:
如果进程在日志文件上有一个打开的文件句柄,则此文件句柄包含一个位置。如果现在日志文件已清空(truncate(1)
,truncate(2)
,open(2)
以便不使用追加标记: > filepath
),则文件的内容确实已从磁盘中删除。如果具有打开文件句柄的进程正在写入此文件,则它将在旧位置写入,例如: G。在几兆字节的位置。对空文件执行此操作将使用零填充空白。
如果可以创建稀疏文件(通常可以在Unix文件系统上使用),这不是真正的问题。否则它将再次快速填满磁盘。但无论如何,它可能会非常令人困惑。