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

如果我使用rm /my/folder/*.* ,那么运行在nginxphp上的networking服务会使用X-Accel-Redirect头文件将文件传递到客户端。 rm /my/folder/*.*如何处理当前正被客户端访问/下载的文件?

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

删除文件时,删除目录到inode的链接。 该链接将被立即删除,以便其他进程将无法find该文件。

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

你可以把文件名看作一种符号链接。

  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. 第二个进程想创build/myapp/myfile.txt 。 操作系统创build文件/inodes/4711并创build一个到/myapp/myfile.txt的符号链接

当然它比这个稍微复杂一些,但是在这个例子中它是一个有用的模型。

顺便说一句,这也是“为什么我的磁盘已满,即使我删除了这个巨大的日志文件,没有别的东西占用了空间” – 如果一个进程还在读取或写入文件,它看不见,你实际上没有清楚。