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

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

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

答案1

当进程开始读取文件时,它会创建一个附加到文件所在的 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

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

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

相关内容