日志程序如何继续记录已删除的文件?

Gee*_*eek 13 logs file-descriptors open-files files

来自Unix Power Tools,第 3 版不是删除文件,而是清空它部分:

如果活动进程打开了该文件(对于日志文件来说并不少见),则删除该文件并创建一个新文件不会影响日志记录程序;这些消息只会继续发送到不再链接的文件中。清空文件不会破坏关联,因此它会在不影响日志记录程序的情况下清除文件。

强调我的

我不明白为什么程序会继续登录到已删除的文件。是不是因为文件描述符条目没有从进程表中删除?

Mic*_*mer 13

当您删除一个文件时,您实际上删除了指向该文件(指向 inode)的链接。如果有人已经打开了那个文件,他们就可以保留他们拥有的文件描述符。该文件保留在磁盘上,占用空间,如果您有权访问它,则可以对其进行写入和读取。

unlink函数由 POSIX 定义为具有以下行为:

当文件的链接数变为 0 且没有进程打开该文件时,该文件占用的空间将被释放,该文件将不再可访问。如果一个或多个进程在删除最后一个链接时打开了文件,则应在 unlink() 返回之前删除该链接,但应推迟文件内容的删除,直到对文件的所有引用都关闭

这条建议是因为这种行为。守护进程将打开该文件,并且不会注意到它已被删除(除非它专门监视它,这并不常见)。它将继续轻松地写入它拥有的现有文件描述符:您将继续占用(更多)磁盘空间,但您将无法看到它写入的任何消息,因此您真的处于最糟糕的状态两个世界的。如果您将文件截断为零长度,则会立即释放空间,并且任何新消息都将附加到文件的新末尾,您可以在其中看到它们。

最终,当守护进程终止或closes 文件时,空间将被释放。与此同时,没有任何新人可以打开该文件(除了通过系统特定的反射接口,如Linux 的/proc/x/fd/...)。它还保证:

如果文件的链接数为0,则当与该文件关联的所有文件描述符都关闭时,该文件占用的空间将被释放,该文件将不再可访问。

因此,您不会永久丢失磁盘空间,但删除文件不会获得任何好处,并且无法访问新邮件。


lge*_*get 8

确切地。

文件是三方的。

  • 内容,即字节的平面数组,写入磁盘上的某处或即时生成。
  • 索引节点,或索引节点的简称,它是一种数据结构填充和内核使用。它包含有关文件的所有元数据(大小、权限等),以及指向文件内容位置的指针。
  • 一个或多个目录条目,这是位置,操作为路径一样/home/user/personal_file,充当手柄,通过它您可以使用该文件,修改其内容,改变它的元数据,等等。

当你打开一个文件时,你提供了操作系统的路径,它会直接返回一个指向 inode 的句柄。使用这个称为文件描述符的句柄,您可以根据需要(或至少在操作系统允许的情况下)操作文件。

你永远不能直接删除一个 inode,你必须提供一个操作系统的路径来要求删除。所以,当你想删除一个文件时,你只删除目录条目。如果文件有其他目录条目,它将继续可访问,即使没有,它的 inode 也不会被删除,同时仍有文件描述符指向它。@MichaelHomer 的回答在这个特定主题上更具技术性和更详细。