rm 会删除 web 客户端当前正在访问的文件吗?

iTe*_*ech 0 linux filesystems debian nginx

我的网络服务运行nginxphp使用X-Accel-Redirect标头向客户端传送文件,如果我使用rm /my/folder/*.*它将如何处理客户端当前正在访问/下载的文件?

Jen*_*y D 11

当进程开始读取文件时,它会创建一个附加到文件所在 inode 的文件句柄。

当您删除文件时,您将删除从目录到 inode 的链接。该链接将被立即删除,因此其他进程将无法找到该文件。

但是,只要 inode 有活动的文件句柄,内容仍然可以从使用该文件句柄的进程访问。一旦所有具有该 inode 的文件句柄的活动进程都关闭了它们的文件句柄,文件所在的空间将被标记为空。

您可以将文件名视为一种符号链接。

  1. 您有一个名为 的文件/inodes/1234,并将其符号链接到/myapp/myfile.txt
  2. 你打开/myapp/myfile.txt。真正发生的是您打开,/inodes/1234因为那是实际文件。
  3. 您删除符号链接/myapp/myfile.txt。原始文件/inodes/1234仍然存在,步骤 2 中打开它的进程仍在读取/访问它。
  4. 另一个进程要求/myapp/myfile.txt. 它不存在,因为您删除了符号链接。(/inodes/1234当然,原版仍然存在!)
  5. 第二个进程想要创建/myapp/myfile.txt. 操作系统创建文件/inodes/4711并创建一个符号链接/myapp/myfile.txt

当然,它比那稍微复杂一些,但在这种情况下它是一个有用的模型。

顺便说一句,这也是对“为什么我的磁盘已满,即使我删除了这个巨大的日志文件并且没有其他东西占用空间”这个问题的答案——如果一个进程仍在读取或写入文件,你刚刚做了它是隐形的,你实际上并没有清除它。

  • @iTech:你为什么不自己测试一下——这很容易做到。 (2认同)