如果我使用rm /my/folder/*.*
,那么运行在nginx
和php
上的networking服务会使用X-Accel-Redirect
头文件将文件传递到客户端。 rm /my/folder/*.*
如何处理当前正被客户端访问/下载的文件?
当一个进程开始从一个文件读取时,它会创build一个附加到文件所在的inode的文件句柄。
删除文件时,删除目录到inode的链接。 该链接将被立即删除,以便其他进程将无法find该文件。
但是,只要inode有一个活动的文件句柄,内容仍然可以从使用该文件句柄的进程访问。 一旦文件句柄的所有活动进程closures了它们的文件句柄,文件所在的空间将被标记为空。
你可以把文件名看作一种符号链接。
/inodes/1234
的文件,并将其链接到/myapp/myfile.txt
/myapp/myfile.txt
。 真正发生的是你打开/inodes/1234
因为那是实际的文件。 /myapp/myfile.txt
。 原始文件/inodes/1234
仍然存在,并且在步骤2中打开它的进程仍在读取/访问它。 /myapp/myfile.txt
。 它不存在,因为你删除了符号链接。 (当然,原始/inodes/1234
仍然存在!) /myapp/myfile.txt
。 操作系统创build文件/inodes/4711
并创build一个到/myapp/myfile.txt
的符号链接 当然它比这个稍微复杂一些,但是在这个例子中它是一个有用的模型。
顺便说一句,这也是“为什么我的磁盘已满,即使我删除了这个巨大的日志文件,没有别的东西占用了空间” – 如果一个进程还在读取或写入文件,它看不见,你实际上没有清楚。